Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

tablica tablic o nieregularnych dlugosciach ?

Ostatnio zmodyfikowano 2014-03-12 20:46
Autor Wiadomość
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:
C/C++
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 ?
P-106176
Monika90
» 2014-03-12 17:30:01
możnaby tak
C/C++
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)
P-106187
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?
P-106207
Monika90
» 2014-03-12 20:18:12
Jak chcesz mieć i polecenie, i odpowiedź to po prostu zrób tak
C/C++
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 } },
    { //itd... },
    };
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>.
P-106215
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?
P-106219
Monika90
» 2014-03-12 20:46:27
Jeżeli oszczędnosć pamięci jest tak ważna, to możesz spróbować tego.
C/C++
const unsigned char wlacz = { 1, 2, 3 };
const unsigned char wlacz_odp = { /*...*/ };
const unsigned char wylacz = { /*...*/ };
const unsigned char wylacz_odp = { /*...*/ };
//itd...

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 },
    //itd...
};

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
P-106221
« 1 »
  Strona 1 z 1