-
1. Data: 2013-05-17 05:18:35
Temat: s->tab[i]
Od: "Zbynio" <...@d...pl>
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.
-
2. Data: 2013-05-17 08:00:23
Temat: Re: s->tab[i]
Od: Zbych <a...@o...pl>
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?
-
3. Data: 2013-05-17 08:41:44
Temat: Re: s->tab[i]
Od: Marcin <m...@o...pl>
On May 17, 5:18 am, "Zbynio" <i...@d...pl> 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
-
4. Data: 2013-05-17 09:06:51
Temat: Re: s->tab[i]
Od: "Zbynio" <...@d...pl>
"Marcin" <m...@o...pl> 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.
-
5. Data: 2013-05-17 09:19:40
Temat: Re: s->tab[i]
Od: "J.F" <j...@p...onet.pl>
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.
-
6. Data: 2013-05-17 09:30:33
Temat: Re: s->tab[i]
Od: ajt <a...@u...com.pl>
W dniu 2013-05-17 09:06, Zbynio pisze:
> 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.
Pokazujesz tylko fragmenty kodu, oczekując podpowiedzi, co jest źle.
Tymczasem błąd tkwi pewnie w kodzie którego nie pokazałeś :)
--
Pozdrawiam
Andrzej
www.radom.ws
-
7. Data: 2013-05-17 09:42:18
Temat: Re: s->tab[i]
Od: Marcin <m...@o...pl>
> 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.
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
-
8. Data: 2013-05-17 22:03:09
Temat: Re: s->tab[i]
Od: "Zbynio" <...@d...pl>
"ajt" <a...@u...com.pl> wrote in message
news:5195dc98$0$1224$65785112@news.neostrada.pl...
>W dniu 2013-05-17 09:06, Zbynio pisze:
>> 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.
>
> Pokazujesz tylko fragmenty kodu, oczekując podpowiedzi, co jest źle.
> Tymczasem błąd tkwi pewnie w kodzie którego nie pokazałeś :)
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ą
-
9. Data: 2013-05-17 22:10:50
Temat: Re: s->tab[i]
Od: "Zbynio" <...@d...pl>
"Zbynio" <...@d...pl> wrote in message
news:51968cfd$0$1248$65785112@news.neostrada.pl...
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] ];
}
}
-
10. Data: 2013-05-17 22:30:31
Temat: Re: s->tab[i]
Od: "Zbynio" <...@d...pl>
"Zbynio" <...@d...pl> wrote in message
news:51968eca$0$1257$65785112@news.neostrada.pl...
>
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ś :-)