Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AVR w C] Składnia C - zapis/odczyt do/z tablicy

marenc 01 Kwi 2008 12:06 2576 7
  • #1 01 Kwi 2008 12:06
    marenc
    Poziom 24  

    Witam, mam drobny problem, którego nie rozumiem. Coś mi szwankuje podczas operacji na tablicach, ponieważ jak przerobiłem program na zwykłe zmienne to wszystko śmiga. Poniżej kod:

    Code:
    uint16_t *Sekwencja[45];
    
    ...
    *Sekwencja[1] = Data;
    if(Data==*Sekwencja[1])
    ...

    Powyższe instrukcje to: deklaracja tablicy(statycznej) Sekwencja o rozmiarze 45 bajtów( od 1 do 45? Czy od 0 do 44?) Następnie zapis zmiennej Data do tablicy w komórkę '1' oraz testowanie IF czy dana została poprawnie zapisana.

    Cały problem polega na tym, że po zapisie zmiennej Data do tablicy - podczas sprawdzania zawartości IF wynik jest fałszywy :| Podejrzewam, że to problem składniowy, skoro wszystko na osobnych zmiennych działa.

    ps. nie piszcie, czy przypadkiem nie zmieniam gdzieś indziej wartości, bo tak nie jest.

    0 7
  • Pomocny post
    #2 01 Kwi 2008 12:11
    Freddie Chopin
    Specjalista - Mikrokontrolery

    poducz sie troche C.

    to co zrobiles to:
    uint16_t *Sekwencja[45];
    - deklaracja 45-elementowej tablicy WSKAZNIKOW na elementy typu unsigned int (EDIT: zgodnie z sugestia z posta ponizej - poprawione)

    *Sekwencja[1] = Data;
    - bierzesz drugi element tablicy, traktujesz go jako adres, wpisujesz DATA pod adres przechowany w sekwencja[1] = program idzie w krzaki

    Data==*Sekwencja[1]
    - j.w. - sprawdzasz czy to na co wskazuje sekwencja[1] (adres w pamieci) rowna sie data - to akurat nie wywali programu... czasami [;

    Sekwencja o rozmiarze 45 bajtów
    - a od kiedy to liczba typu unsigned int ma rozmiar 1 bajtu? jak dla mnie to ona ma 2 bajty.

    deklaracja tablicy(statycznej)
    - a niby czemu statycznej?

    od 1 do 45? Czy od 0 do 44?
    - od zera. zawsze.

    poprawny kod:

    Code:

    unsigned int Sekwencja[45];
    ...
    Sekwencja[0] = Data;
    if(Data==Sekwencja[0])
    ...


    zaglebmy sie teraz we wskazniki. deklaracja tablicy jest defacto deklaracja wskaznika na pierwszy jej element.

    tablica[0] jest 100% tozsame z *tablica:

    Sekwencja[0] = Data;
    *Sekwencja = Data;

    indeksowanie tablicy mozna przedstawic nastepujaco:

    tablica[N] == *(tablica+N*sizeof(*tablica))

    w twoim przypadku:

    tablica[N] == *(tablica+N*sizeof(unsigned int)) == *(tablica+N*2)

    dlatego mozna tez tak:

    Code:

    unsigned int Sekwencja[45];
    ...
    *Sekwencja = Data;
    if(Data==*Sekwencja)
    ...


    niemniej jednak nalezy pamietac, ze tablica jest wskaznikiem typu const - nie mozna wiec zrobic tak:

    *sekwencja++=data;

    aby takie myki wykonywac, trzeba dostawic dodatkowa zmienna wskaznika na tablice:

    Code:

    unsigned int i,tablica[10];
    unsigned int *array_ptr=tablica; // BEZ &, bo 'tablica' jest juz wskaznikiem!
    // mozna i tak: unsigned int *array_ptr=&tablica[0]; - bo tablica[0] to juz konkretna zmienna

    for(i=0;j<10;i++)
       *array_ptr++=data;


    podwojna tablica jest wskaznikiem na tablice wskaznikow do tablic [; czyli zalozmy ze jest sobie tablica[N][M]. i teraz samo *tablica wskazuje na N-elementowy blok wskaznikow, z ktorych kazdy wskazuje na liniowa tablice M-elementowa. troche to zakrecone, ale idzie zrozumiec.

    0x41 0x56 0x45!!

    0
  • #3 01 Kwi 2008 12:24
    marenc
    Poziom 24  

    Ładny wykładzik, który bardzo mi oświecił sprawę :D Niestety C nauczyłem się sam, a błędy wynikają z przyzwyczajenia do Pascal'a ;) Wielkie dzienx za pomoc :)

    0
  • #4 01 Kwi 2008 12:34
    fantom
    Poziom 31  

    Freddie Chopin napisał:

    poducz sie troche C.

    Chyba tez powinienes
    Freddie Chopin napisał:

    to co zrobiles to:
    uint16_t *Sekwencja[45];
    - deklaracja WSKAZNIKA na 45-elementowa tablice

    Raczej deklaracja 45 elementowej tablicy wskaznikow, roznica jest zasadnicza.

    Co do bledu w kodzie to wystarczy zmienic
    Code:

    *Sekwencja[1] = Data;

    na
    Code:

    Sekwencja[1] = &Data;

    i powinno chulac.

    0
  • #5 01 Kwi 2008 16:32
    bua
    Poziom 12  

    Cytat:
    Kod:

    Sekwencja[1] = &Data;


    i powinno chulac.


    Powinno tyle ze w tym wypadku koledze nie wypali koncepcja programu...
    bo nie wazne co i kiedy bedzie wpisywal, jakiekolwiek operacje beda pokazywac na Data ,
    prosciej mowiac pod Sekwencja[0] zapisales sobie cos,
    potem za 5min Data ci sie zmienila i zapisujesz pod
    Sekwencja[1] = &Data
    za 5min
    Sekwencja[2] = &Data

    i w koncu chcesz odczytac Sekwencja[1]
    i co sie okazuje, ze kazdy element Sekwencji jest sobie rowny....bo sie rowna &Data

    pzdr

    0
  • #6 02 Kwi 2008 08:26
    fantom
    Poziom 31  

    bua napisał:

    Powinno tyle ze w tym wypadku koledze nie wypali koncepcja programu...

    To jest oczywiste ale w przytoczonym przypadku bedzie dzialac.A co do koncepcji calego programu to sie nie wypowiadam bo jej nie znam i ty chyba tez nie (byc moze dla kazdego elementu bedzie deklarowal nowa zmienna).

    0
  • #7 02 Kwi 2008 09:39
    bua
    Poziom 12  

    Zgadzam sie.
    Dla Ciebie jest to oczywiste dla mnie tez,
    ale kolega moze nie ma takiej swiadomosci... dlatego
    uważam warto poruszyc ten temat.

    pzdr.

    0
  • #8 02 Kwi 2008 09:43
    marenc
    Poziom 24  

    Ja już rozumiem jaki błąd zrobiłem. Dzięki za pomoc. Zmylił mnie też kompilator ostrzegający o niezgodności adresowania(czy czegoś takiego), a że do tej pory nie rozróżniałem wskaźników od zmiennych to wklepywałem '*' ;)

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo