• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Zmiana nazwy wskaźników i wpisanie ich do tablicy za pomocą pętli

Object Storage Arubacloud
0 głosów
354 wizyt
pytanie zadane 21 października 2020 w C i C++ przez Miki Bywalec (2,480 p.)
zamknięte 22 października 2020 przez Miki

Witam,

Program działa ale próbuję zmienić nazwy wskaźników aby je szybko wprowadzić do tablicy i móc później program rozszerzyć bo obecnie każdy ze wskaźników muszę dodawać do tablicy ręcznie. Chodzi mi o osiągnięcie czegoś na zasadzie:

  for (uint8_t i=0; i<ilosc_wskaznikow; i++){
    tab[i] = wskaznik[i];
  }

tylko że takie coś nie działa i nie wiem jak to ugryźć. Chciałem w "struct EventData z pliku *.h" pozmieniać nazwy ale sypie się program. Jestem dość mocno zielony a ten kod powoli rozgryzam i przerabiam pod swoje potrzeby z gotowca więc prosił bym o jasne wskazówki jak dla kogoś kto pierwszy raz to widzi na oczy wink

Fragment kodu który chce zmienić:

void Events::OnChanged(const EventData *evt){
  int tab[rpt_gamepad_len] = {evt->channel_1,
                              evt->channel_2,
                              evt->channel_3,
                              evt->channel_4,
                              evt->channel_5,
                              evt->channel_6,
                              evt->channel_7};

  for (uint8_t i=0; i<rpt_gamepad_len; i++){
    Serial.println(tab[i]);
  }
}

Cały program:

// plik *ino

#include <hiduniversal.h>
#include "usb.h"

USB Usb;
HIDUniversal Hid(&Usb);
Events padEvents;
ReportParser Pad(&padEvents);

void setup(){
  Serial.begin(115200);
  Serial.println("Start");

  if(Usb.Init() == -1) Serial.println("OSC did not start");

  delay(200);

  if(!Hid.SetReportParser(0, &Pad)) ErrorMessage<uint8_t>(PSTR("SetReportParser"), 1);
}

void loop(){
  Usb.Task();
}
// plik *.cpp

#include "usb.h"

void ReportParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf){
  bool match = true;

  for (uint8_t i=0; i<rpt_gamepad_len; i++){
    if(buf[i] != oldPad[i]){
      match = false;
      break;
    }
  }

  if(!match && padEvents){
    padEvents->OnChanged((const EventData*)buf);

    for (uint8_t i=0; i<rpt_gamepad_len; i++) oldPad[i] = buf[i];
  }
}

void Events::OnChanged(const EventData *evt){
  int tab[rpt_gamepad_len] = {evt->channel_1,
                              evt->channel_2,
                              evt->channel_3,
                              evt->channel_4,
                              evt->channel_5,
                              evt->channel_6,
                              evt->channel_7};

  for (uint8_t i=0; i<rpt_gamepad_len; i++){
    Serial.println(tab[i]);
  }
}
// plik *.h

#include <hiduniversal.h>

struct EventData{
  uint8_t channel_1, channel_2, channel_3, channel_4, channel_5, channel_6, channel_7;
};

#define rpt_gamepad_len sizeof(EventData)/sizeof(uint8_t)

class Events{
  public:
    virtual void OnChanged(const EventData *evt);
};

class ReportParser : public HIDReportParser{
  Events *padEvents;

  uint8_t oldPad[rpt_gamepad_len];

  public:
    ReportParser(Events *evt) : padEvents(evt){};
    virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
};

Jest to przechwytywanie przycisków z gamepada przez ardruino za pomocą usb shield. Chcę otrzymane wyniki wpakować do tablicy i przesłać do drugiego ardruino.

komentarz zamknięcia: Problem rozwiązany. Jeszcze raz dzięki
komentarz 21 października 2020 przez tangarr Mędrzec (154,780 p.)
Ten kod, który wstawiłeś to jest aktualnie działający kod? Czy kod po przeróbkach z którym są problemy?
komentarz 21 października 2020 przez Miki Bywalec (2,480 p.)
Kod działa prawidłowo.

Chcę go ulepszyć przez zmianę nazwy wskaźników w taki sposób aby dodając nowy wskaźnik w *.h nie musieć już nic więcej dotykać.

Obecnie ręcznie muszę dodać nowy wskaźnik w pliku *.h oraz zmieniać pętlę i tablicę w *.cpp
komentarz 21 października 2020 przez tangarr Mędrzec (154,780 p.)
Co rozumiesz przez "wskaźnik"? Struktura EventData nie zawiera żadnych wskaźników.
komentarz 21 października 2020 przez Miki Bywalec (2,480 p.)

Chodzi mi dokładnie o ten fragment "evt->channel_1"

to jest wskaźnik nie?

w EventData  mam channel_1 i chce to zmienić abym miał z tego np. tablice channel_[i] lub zmienną abym mógł ją wpisać do tablicy

no nie umiem się fachowo wysłowić crying

Chcę zmienić:

evt->channel_1

evt->channel_2

...

evt->channel_7

 

na coś co będzie działać na zasadzie
 

for (uint8_t i=0; i<ilosc_wskaznikow; i++){

  tab[i] = evt->channel[i];

}

aby dodając channel_8 dopisać go tylko w EventData

komentarz 22 października 2020 przez j23 Mędrzec (194,920 p.)

To nie możesz po prostu zrobić tablicy channels w EventData zamiast tych channel_[1-7]?

komentarz 22 października 2020 przez Miki Bywalec (2,480 p.)

Tak jak pisałem jestem zielony i mam jeszcze małą wiedzę na temat programowania. Na wpisanie tego od razu w tablice wpadłem dopiero po podpowiedzi użytkownika tangarr ale z tego co widzę podał mi troszkę inne rozwiązanie poniżej. Co nie zmienia faktu, że zobaczę które "ładniej wygląda".

Dziękuję za pomoc smiley

1 odpowiedź

+1 głos
odpowiedź 21 października 2020 przez tangarr Mędrzec (154,780 p.)

W tej sytuacji proponuję przerobić strukturę DataEvent na unię.

union EventData {
    struct {
        uint8_t channel_1, channel_2, channel_3, channel_4, channel_5, channel_6, channel_7;
    };
    uint8_t channels[7];
};

Dzięki takiej konstrukcji będziesz mógł używać pól channel_X tak jak do tej pory oraz używać tablicy channels aby pobrać ich wartości.

EventData eventData;
eventData.channel_1 = 11;
eventData.channel_2 = 22;
eventData.channel_3 = 33;
eventData.channel_4 = 44;
eventData.channel_5 = 55;
eventData.channel_6 = 66;
eventData.channel_7 = 77;

for (int i=0; i<7; i++) {
    std::cout << i << " " << (int)eventData.channels[i] << std::endl;
}

 

komentarz 21 października 2020 przez Miki Bywalec (2,480 p.)
edycja 21 października 2020 przez Miki

Pomysł wydaje się dobry ale nie działa tak jak bym chciał.

przy samym eventData.channel_1; łapie wartość początkową czyli zero

przy dodaniu wskaźnika eventData.channel_1 = evt->channel_1; wprowadzam jak by ręcznie i mi to za dużo nie daje bo muszę wypisać samemu evt->channel_1 ... evt->channel_7

komentarz 22 października 2020 przez tangarr Mędrzec (154,780 p.)

Zupełnie nie rozumiesz co się dzieje w kodzie.

W funkcji Events::OnChanged zmienna evt jest wskaźnikiem na strukturę EventData. Poszczególne pola tej struktury nie są wskaźnikami tylko zwykłymi liczbami.

Kod który umieściłem wyżej jest przykładem użycia mojej uni EventData zamiast twojej struktury EventData.

Jeżeli zamienisz strukturę

struct EventData{
  uint8_t channel_1, channel_2, channel_3, channel_4, channel_5, channel_6, channel_7;
};

na unię
 

union EventData {
    struct {
        uint8_t channel_1, channel_2, channel_3, channel_4, channel_5, channel_6, channel_7;
    };
    uint8_t channels[7];
};

to twój stary kod będzie działać tak samo, ale będziesz mógł iterować po polach uni w funkcji Events::OnChanged w ten sposób

void Events::OnChanged(const EventData *evt){
  for (uint8_t i=0; i<rpt_gamepad_len; i++){
    Serial.println(evt->channels[i]);
  }
}

 

komentarz 22 października 2020 przez Miki Bywalec (2,480 p.)

Działa!!!

Bardzo dziękuję za pomoc smiley

Podobne pytania

0 głosów
1 odpowiedź 604 wizyt
pytanie zadane 11 listopada 2016 w C i C++ przez Ayaka Nowicjusz (170 p.)
+1 głos
1 odpowiedź 1,419 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez Avalon Obywatel (1,130 p.)
0 głosów
1 odpowiedź 522 wizyt
pytanie zadane 20 stycznia 2016 w C i C++ przez Jonki Dyskutant (8,180 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...