tookie009 Temat założony przez niniejszego użytkownika |
tablica tablic o nieregularnych dlugosciach ? » 2014-03-12 16:32:30 wysylam do mojego urzadzenia podlaczonego do usb polecenia. Owe urzadzenie odpowiada mi zawsze z gory zdefiniowanymi wytycznymi mniej wiecej wyglada to tak: const char polecenie[ 5 ] = { 0x56, 0xAA, 0x22, 0x54, 0x43 }; const char odpowiedz[ 2 ] = { 0x23, 0xAB };
Problem w tym, ze mam okolo 100 roznach takich polecen, i glupio jest dla kazdego polecenie odowlywac sie nazwa. Odpowiedzi i polecenia skladaja sie z roznej liczby znakow,np odpowiedz [2], odpowiedz[22]. Mozna to jakos zapakowac w dwuwymiarowa tablice? Jezeli nie to jak zroibc to inaczej a rowniez elgancko ? |
|
Monika90 |
» 2014-03-12 17:30:01 możnaby tak struct Command { enum { max_size = 22 }; std::size_t size; unsigned char bytes[ max_size ]; };
const Command cmds[] = { { 3, { 0x11, 0x22, 0x33 } }, { 4, { 0xff, 0xff, 0xff, 0xff } }, { 1, { 0 } } };
ale ma to pewne wady, trzeba podawać rozmiar każdego polecenia, a można się przecież pomylić. Zwróć uwagę, że użyto tam unsigned char zamiast char. Maksymalna wartość char w wielu systemach to 127, czyli np. 0xAA jest poza zakresem. unsigned char ma zakres od 0 do 255 (lub więcej) |
|
tookie009 Temat założony przez niniejszego użytkownika |
» 2014-03-12 19:40:35 nie do konca rozumiem ;) po co jest to enum i czemu zadeklarowane w strukturze - zeby tylko tam bylo "widoczne"? i przy okazji ograniczyc maks. liczba znakow do 22 ? nie chciales napisac unsigned char bytes[ size ]; ?? Czyli po prostu robisz strukture 2 elementowa, gdzie pierwszym elementem jest rozmiar taplicy a drugim po prostu ta tablica?? Jezeli tak, zo chyba mnei zrozumiales bardziej by mi chodzilo o cos takiego: array komunikacja[x][x]; komunikacja[0][0]=polecenie; komunikacja[0][1]=odpowiedz
//dalej mam funkcje: rozkaz(index tablicy) { wyslijpolecenie(komunikacja[x][0]); sprawdzodpoweidz(komunikacja[x][1]); }
BTW. mam takie male pytanie, chyba za male na osobny temat, a to jest troche z tym powiazane: potrzebuje te odpowiedzi z urzadzenia gdzies zapisac, tak zebym mogl ja porownac do odpowiedzi z gory odkreslonych (czy odpowiedz jest poprawna). Jak wiadomo odpowiedzi sa roznej wielkosci. Ogolem to jest jedna klasa. Moje pytanie, ta tablica do zapisywania tymczasowo odpowiedzi powinna byc zdeklarowana w headerze klasy czy w ciele? Jezeli tak to czy powinno to miec postac: char template[liczbaZnakowWNajdluzszejOdpowiedzi] czy moze char *template i za kazdym razem new i delete uzywac ? Ktora opcaj jest efektowniejesza? |
|
Monika90 |
» 2014-03-12 20:18:12 Jak chcesz mieć i polecenie, i odpowiedź to po prostu zrób tak struct Command { enum { max_size = 22 }; std::size_t cmd_size; unsigned char cmd[ max_size ]; std::size_t ans_size; unsigned char ans[ max_size ]; };
const Command cmds[] = { { 5, { 0x56, 0xAA, 0x22, 0x54, 0x43 }, 2, { 0x23, 0xAB } }, { };
max_size musi być podane bo struktura musi mieć jeden określony z góry rozmiar, tzn. rozmiar tablic które są elementami struktury musi być podany w jej definicji. W C++11 można by użyc std::vector<unsigned char> albo std::initializer_list<unsigned char>. |
|
tookie009 Temat założony przez niniejszego użytkownika |
» 2014-03-12 20:33:28 genialne rozwiazanie z taka struktura, ze tez sam na to nie wpadlem! Ale to ma jedna duza wade... Docelowo program ma pracowac na mikrokontrolerze i w ten sposob zostanie zmarnowane sporo pamieci. Z drugiej strony wektory, tez sporo "pamieci" zezra, tak mi sie wydaje, wiec jednak najelpszym rozwiazaniem, bedzie zadeklarowanie tych polecen "recznie" czyli const char wlacz_kamere[] = { 0x12, 0x22, 0x12 }; (policzylem mam 12 polecen do wysylania czyli i 12 odpowiedzi, tak duzo wcale nie jest, jak na poczatku zakladalem). A moglabys przy okazji jeszcze podac odpowiedz na pytanie postawione w drugim poscie, tak zeby mozna bylo spokojnie zamknac ten temat ;) ? Dziekuje za juz udzielone mi odpowiedzi. EDIT. i dlaczego enum a nie const int? |
|
Monika90 |
» 2014-03-12 20:46:27 Jeżeli oszczędnosć pamięci jest tak ważna, to możesz spróbować tego. const unsigned char wlacz = { 1, 2, 3 }; const unsigned char wlacz_odp = { }; const unsigned char wylacz = { }; const unsigned char wylacz_odp = { };
struct Command { std::size_t cmd_size; const unsigned char * cmd; std::size_t odp_size; const unsigned char * odp; };
const Command cmds[] = { { sizeof( wlacz ), wlacz, sizeof( wlacz_odp ), wlacz_odp }, { sizeof( wylacz ), wylacz, sizeof( wylacz_odp ), wylacz_odp }, };
Mozna by użyć initializer_list ale na mikrokontrolerze pewnie tego nie ma. BTW.
mam takie male pytanie, chyba za male na osobny temat, a to jest troche z tym powiazane: potrzebuje te odpowiedzi z urzadzenia gdzies zapisac, tak zebym mogl ja porownac do odpowiedzi z gory odkreslonych (czy odpowiedz jest poprawna). Jak wiadomo odpowiedzi sa roznej wielkosci. Ogolem to jest jedna klasa. Moje pytanie, ta tablica do zapisywania tymczasowo odpowiedzi powinna byc zdeklarowana w headerze klasy czy w ciele? Jezeli tak to czy powinno to miec postac: char template[liczbaZnakowWNajdluzszejOdpowiedzi] czy moze char *template i za kazdym razem new i delete uzywac ? Ktora opcaj jest efektowniejesza? |
Raczej to: char template[liczbaZnakowWNajdluzszejOdpowiedzi], z tym że template to słowo kluczowe. EDIT. i dlaczego enum a nie const int? |
mniej pisania |
|
« 1 » |