Money.plTechnologie dla biznesu Grupy dyskusyjne pl.misc.elektronika s->tab[i]

s->tab[i]

s->tab[i]

"Zbynio" <i...@dont.pl> / 2013-05-17 05:18:35
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.
 
Czytaj także na forum

Re: s->tab[i]

Zbych <a...@onet.pl> / 2013-05-17 08:00:23
W dniu 2013-05-17 05:18, Zbynio pisze:
> 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.

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

Re: s->tab[i]

Marcin <m...@o2.pl> / 2013-05-17 08:41:44
On May 17, 5:18 am, "Zbynio" wrote:
> 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.

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]

"Zbynio" <i...@dont.pl> / 2013-05-17 09:06:51

"Marcin" wrote in message
news:2b2eefb0-906c-4404-b58d-f29a0422569c@m4g2000vbr.googlegroups.com...

>> 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.

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]

"J.F" <j...@poczta.onet.pl> / 2013-05-17 09:19:40
Użytkownik "Zbynio" napisał w wiadomości
>Czy taka operacja może się źle skompilować ?

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

>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];

Poprawnie.

>albo coś podobnego tyle, że
>uint8_t *ptr = (uint8_t *) &struktura;
>i dalej to samo
>while (i--) {
>s->tab[i] = ptr[i];

tez poprawnie.

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

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

J.
 
wstecz
1 2 3
współpraca