s->tab[i]

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
Witam,
AvrStudio AVR
Czy taka operacja może się źle skompilować ?

Mam strukturę i do niej wskaźnik i w niej tablice i różne takie

i gdzieś w kodzie robie sobię

while (i--) {
s->tab[i] = s->costam[i];

albo coś podobnego tyle, że

uint8_t *ptr = (uint8_t *) &struktura;

i dalej to samo

while (i--) {
s->tab[i] = ptr[i];

Czy ma to prawo nie działać ?  Tak jakby się dane nie przepisywały.  


Re: s->tab[i]
W dniu 2013-05-17 05:18, Zbynio pisze:
Quoted text here. Click to load it

Tak, jak coś spie@#$@#sz. Słyszałeś o czymś takim jak debuger?


Re: s->tab[i]
Quoted text here. Click to load it
ły.

Przy zalozeniu, ze "s" to wskaznik na strukture a nie sama struktura,
powinno byc ok.  Na szybko sobie sprawdzilem w Keilu na inny procesor,
czy z punktu widzenia C jest ok.
Wersja "s->tab[i] = ptr[i];" troche optymistycznie przyjmuje, ze adres
poczatku struktury jest tozsamy z poczatkiem pierwszej tablicy w niej
zawartej (jesli jest pierwszym elementem struktury). Tu bedzie
probowac przepisywac kolejne bajty z poczatku struktury do tablicy,
bedacej gdzies w tej strukturze. Jak dla mnie to ryzykowne, pozniejsze
zmiany w typedef structury na pewno cos popsuja.
Marcin


Re: s->tab[i]


Quoted text here. Click to load it

No właśnie. Co do panowania nad strukturą to nad nią panuję, bo mam ją po to  
żeby była to taka swoista "lookup table". Le to jedno miejsce nie działa i  
już wczoraj się dziwiłem co jest nie tak, robiłem podwójne inicjowaie  
wskaźników, dla pewności.
Czy znaczy mam nie przyjmować do wiadomości, że adres struktury to początek  
pierwszego elementu? To jest wtgodne, bo raz rozmawiam ze struktuą, albo  
przez strukturę po elementach

s->tab1[]
s->tab2[]....

a raz traktuję ją jako ciągły obszar jak kawałek ramu liczony od wskaśnika  
ustawionego na początek. Wszędzie mi działa tylko to kopiowanie nie działa.

Ale jak wpiszę:

s->tab[i] = ptr[0x98]; czy inny 0x to dane w tab[i] są dobre :-) Te co  
siedzą tam względem ptr. Tak jakby zmiennej nie brał pod uwagę. Zupełnie  
irracjonalna sprawa.  


Re: s->tab[i]
W dniu 2013-05-17 09:06, Zbynio pisze:
Quoted text here. Click to load it

Pokazujesz tylko fragmenty kodu, oczekując podpowiedzi, co jest źle.
Tymczasem błąd tkwi pewnie w kodzie którego nie pokazałeś :)
--  
Pozdrawiam
Andrzej
We've slightly trimmed the long signature. Click to see the full one.
Re: s->tab[i]

Quoted text here. Click to load it

void test(void) {

  size_t i;

  uint8_t buf[32];

  uint8_t *ptr = (uint8_t *)&mystruct;

  eeprom_read_block((void*)&buf[0], (const void*)(EEDATA), 34);

  for (i=buf[0]; i<buf[1]; i++) {

    f->A[i] = ptr[ buf[2 + i] ];

  }

}

W eepromie siedzą numery póll struktury, które mam sobie pobrać.

adres 0 to początek

adres 1 ilosc

2..34 dane. I dane tam są


Re: s->tab[i]


Tam jest buf[34], teraz ręcznie to przepisałem z błędem

void test(void) {

  size_t i;

  uint8_t buf[34];

  uint8_t *ptr = (uint8_t *)&mystruct;

  eeprom_read_block((void*)&buf[0], (const void*)(EEDATA), 34);

  for (i=buf[0]; i<buf[1]; i++) {

    f->A[i] = ptr[ buf[2 + i] ];

  }

}



Re: s->tab[i]

Quoted text here. Click to load it

Aż wstyd się przyznać :-)

W #define EEDATA pomyliłem adres w eepromie i patrzyłem na to 100 razy, a  
były 2 cyferki zamienione miejscami i czytał z obszaru eepromu gdzie były  
zera :-) Oh LOL :-)
2 dni na akie coś :-)  


Re: s->tab[i]

Quoted text here. Click to load it

Ale za to przerobiłem wszystkie sposoby zapisu i odwoływania się przez  
wskaźniki :-) Zawsze to coś :-)


Re: s->tab[i]
Quoted text here. Click to load it
 mam ją po to
Quoted text here. Click to load it
ała i
Quoted text here. Click to load it
jowaie
początek
Quoted text here. Click to load it
o
d wskaśnika
Quoted text here. Click to load it
 działa.
Quoted text here. Click to load it
o
upełnie
Quoted text here. Click to load it

Czy w strukturze oprocz tablic sa jeszcze jakies inne dane ?
najlepiej podaj tu definicje calej struktury, bedzie wiadomo co w niej
siedzi.
Takie moje gdybanie bez znajomosci kodu. Na AVRy dosc dawno nie
pisalem, ze moze kompilator cos optymalizuje ( struct packed ??? ale
zastanawiam sie, czy packed dla 8 bitowej platformy ma znaczenie ??) .

Tablice zawarte w strukturze sa typu uint8_t ??

Sprobowalem taki kawalek kodu ale __UWAGA__ nie w AvrStudio !!
/*********************************/
typedef struct tdAvrStruct {
    UINT8 i;
    UINT8 tablica[10];
    UINT16 tablica16 [10];
    UINT16 licznik;

    } AVR_STRUCT;


    AVR_STRUCT myStruct, *pmyStruct;
    UINT16 j;


    pmyStruct = &myStruct;

    for (j=0; j < 10; j++)
        pmyStruct->tablica[j] = j;

    for (j=0; j y 10; j++)
        pmyStruct->tablica16[j] = 3 * pmyStruct->tablica[j];
/*********************************/

i po wykonaniu mam w tablica16 trzykrotnie zwiekszone wartosci
wczesniej zainicjalizowane w tablica.

mozesz tez sprobowac zamiast :

while (i--) {
s->tab[i] = ptr[i];

czegos takiego:
while (i--){
    s->tab[i] = * (ptr +  i );
}
teoretycznie to samo jak  ptr[i], ale moze faktycznie kompilator cos
miesza?
Marcin



Re: s->tab[i]
Użytkownik "Zbynio"  napisał w wiadomości
Quoted text here. Click to load it

Wszystko sie moze zle skompilowac jak jest blad kompilatora :-)
Czas zajrzec w wygenerowany kod w assemblerze.

Quoted text here. Click to load it


Poprawnie.


tez poprawnie.


A "i" jest prawidlowe ? Nie traktowane jako ujemne ?

J.


Site Timeline