RTV forum PL | NewsGroups PL

Kompatybilność wskaźników w strukturze AVRP w AvrStudio? Może nie działać?

s->tab[i]

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Kompatybilność wskaźników w strukturze AVRP w AvrStudio? Może nie działać?

Zbynio
Guest

Fri May 17, 2013 3:18 am   



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.

Zbych
Guest

Fri May 17, 2013 6:00 am   



W dniu 2013-05-17 05:18, Zbynio pisze:
Quote:
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?

Zbynio
Guest

Fri May 17, 2013 7:06 am   



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

Quote:
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 Smile Te co
siedzą tam względem ptr. Tak jakby zmiennej nie brał pod uwagę. Zupełnie
irracjonalna sprawa.

J.F
Guest

Fri May 17, 2013 7:19 am   



Użytkownik "Zbynio" napisał w wiadomości
Quote:
Czy taka operacja może się źle skompilować ?

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

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

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

tez poprawnie.

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

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

J.

ajt
Guest

Fri May 17, 2013 7:30 am   



W dniu 2013-05-17 09:06, Zbynio pisze:
Quote:
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ś Smile
--
Pozdrawiam
Andrzej
www.radom.ws

Marcin
Guest

Fri May 17, 2013 8:41 am   



On May 17, 5:18 am, "Zbynio" <i...@dont.pl> wrote:
Quote:
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

Marcin
Guest

Fri May 17, 2013 9:42 am   



Quote:
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 Smile 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

Zbynio
Guest

Fri May 17, 2013 8:03 pm   



"ajt" <ajt@usunajt.com.pl> wrote in message
news:5195dc98$0$1224$65785112@news.neostrada.pl...
Quote:
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ś Smile

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ą

Zbynio
Guest

Fri May 17, 2013 8:10 pm   



"Zbynio" <i@dont.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] ];

}

}

Zbynio
Guest

Fri May 17, 2013 8:30 pm   



"Zbynio" <i@dont.pl> wrote in message
news:51968eca$0$1257$65785112@news.neostrada.pl...
Quote:


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 Smile Oh LOL Smile
2 dni na akie coś Smile

Zbynio
Guest

Fri May 17, 2013 8:32 pm   



"Zbynio" <i@dont.pl> wrote in message
news:51969368$0$1227$65785112@news.neostrada.pl...
Quote:

"Zbynio" <i@dont.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 Smile Oh LOL Smile
2 dni na akie coś Smile

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

elektroda NewsGroups Forum Index - Elektronika Polska - Kompatybilność wskaźników w strukturze AVRP w AvrStudio? Może nie działać?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map