RTV forum PL | NewsGroups PL

Jak poprawnie przesuwać wskaźnik i przypisywać bajty do elementów struktury w AVR-GCC?

avr-gcc i operacje na strukturach określinych przez ws kaźni

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie przesuwać wskaźnik i przypisywać bajty do elementów struktury w AVR-GCC?

Saper/nolin11
Guest

Tue May 15, 2007 8:26 pm   



Witam,

Mam problem z przypisaniem bajtu pod adres po przesunięciu wskaźnika.
I tak mam zadeklarowane strukture:
EE_STD_CODE std_code;
EE_STD_CODE *p_std_code;
I trochę dalej w kodzie przypisuje do wskaźnika strukturę:

p_std_code = &std_code;

I ażeby szybciej ładować dane do struktury chcę zapisywać pod poszczególne
elementy struktury przrz przesunięcie wkaźnika wygryzmoliłem coś takiego
ale nie działa :/ :

//uint8_t tmp3, tmp4, tmp5;

tmp4=0;
for (tmp3=0;tmp3<29;tmp3++) { // struktura ma 29 bajtów (0..2Cool
tmp5 = HexToDec(g_rs_buf[6+tmp3],g_rs_buf[7+tmp3]); // pobierz 2 znaki
Hexodecymalne z bufora RS i zamień je na liczbę 8bit
memcpy(p_out_code,&tmp5,1); // skopuj pod adres ze wskaźnika (do
elementu struktury) odczytaną liczbę z bufora
p_out_code++; // przesuń wskaźnik na kolejny element struktury
tmp4 =+ 2;
}

Ze wskaźnikami u mnie nie za dobrze :/ więc może być w moim toku myślenia
błąd (nawet duży).

--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700

Bogdan G
Guest

Wed May 16, 2007 6:24 am   



Quote:
Mam problem z przypisaniem bajtu pod adres po przesunięciu wskaźnika.
I tak mam zadeklarowane strukture:
EE_STD_CODE std_code;
EE_STD_CODE *p_std_code;
I trochę dalej w kodzie przypisuje do wskaźnika strukturę:

p_std_code = &std_code;

I ażeby szybciej ładować dane do struktury chcę zapisywać pod poszczególne
elementy struktury przrz przesunięcie wkaźnika wygryzmoliłem coś takiego
ale nie działa :/ :

//uint8_t tmp3, tmp4, tmp5;

tmp4=0;
for (tmp3=0;tmp3<29;tmp3++) { // struktura ma 29 bajtów (0..2Cool
tmp5 = HexToDec(g_rs_buf[6+tmp3],g_rs_buf[7+tmp3]); // pobierz 2 znaki
Hexodecymalne z bufora RS i zamień je na liczbę 8bit

tutaj chciałeś zapewne napisać:
tmp5 = HexToDec(g_rs_buf[6+tmp4],g_rs_buf[7+tmp4]);

Quote:
memcpy(p_out_code,&tmp5,1); // skopuj pod adres ze wskaźnika (do
elementu struktury) odczytaną liczbę z bufora

a tutaj zgodnie z deklarację p_std_code

Quote:
p_out_code++; // przesuń wskaźnik na kolejny element struktury

A tutaj sam nie wiem jaka powinna być wartość wskaźnika p_out_code:
czy powinna wskazywać na następny bajt, czy na następny element tablicy
elementów EE_STD_CODE.
Jeśli chcę uzyskać zwiększenie o jeden bajt w takim przypadku korzystam ze
wskaźnika na zmienną typu uint8.

Quote:
tmp4 =+ 2;
}


Artur M. Piwko
Guest

Wed May 16, 2007 7:42 am   



In the darkest hour on Tue, 15 May 2007 21:26:08 +0200,
Saper/nolin11 <nolin11_USUNT_TO@interia.pl> screamed:
Quote:
Mam problem z przypisaniem bajtu pod adres po przesunięciu wskaźnika.
I tak mam zadeklarowane strukture:
EE_STD_CODE std_code;
EE_STD_CODE *p_std_code;

[1]

Quote:
I trochę dalej w kodzie przypisuje do wskaźnika strukturę:

p_std_code = &std_code;


[2]

Quote:
I ażeby szybciej ładować dane do struktury chcę zapisywać pod poszczególne
elementy struktury przrz przesunięcie wkaźnika wygryzmoliłem coś takiego
ale nie działa :/ :

//uint8_t tmp3, tmp4, tmp5;

tmp4=0;
for (tmp3=0;tmp3<29;tmp3++) { // struktura ma 29 bajtów (0..2Cool

Struktura ma sizeof(std_code) bajtów. Tak będzie bezpieczniej. :)

Quote:
tmp5 = HexToDec(g_rs_buf[6+tmp3],g_rs_buf[7+tmp3]); // pobierz 2 znaki
Hexodecymalne z bufora RS i zamień je na liczbę 8bit
memcpy(p_out_code,&tmp5,1); // skopuj pod adres ze wskaźnika (do
elementu struktury) odczytaną liczbę z bufora
p_out_code++; // przesuń wskaźnik na kolejny element struktury

To spowoduje przejście do następnej struktury, nie do następnego bajtu.
Ustaw wskaźnik w [1] jako: char * p_std_code
i w [2] p_std_code = (char *) &std_code.

Quote:
tmp4 =+ 2;
}

Ze wskaźnikami u mnie nie za dobrze :/ więc może być w moim toku myślenia
błąd (nawet duży).


Podsumowując:
- tak czy inaczej użyłbym '->' jak normalny czarny człowiek.
- zrób coś z tymi tmp3, tmp4 i tmp5 bo jak się na nie patrzy to zęby
bolą... ;-)

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:230B ]
[ 08:38:50 user up 11343 days, 20:33, 1 user, load average: 0.06, 0.06, 0.06 ]

The fortune '$ rm -r $HOME' could be extremely unsettling!!

Artur M. Piwko
Guest

Wed May 16, 2007 8:42 am   



In the darkest hour on Tue, 15 May 2007 21:26:08 +0200,
Saper/nolin11 <nolin11_USUNT_TO@interia.pl> screamed:
Quote:
Mam problem z przypisaniem bajtu pod adres po przesunięciu wskaźnika.
I tak mam zadeklarowane strukture:
EE_STD_CODE std_code;
EE_STD_CODE *p_std_code;

[1]

Quote:
I trochę dalej w kodzie przypisuje do wskaźnika strukturę:

p_std_code = &std_code;


[2]

Quote:
I ażeby szybciej ładować dane do struktury chcę zapisywać pod poszczególne
elementy struktury przrz przesunięcie wkaźnika wygryzmoliłem coś takiego
ale nie działa :/ :

//uint8_t tmp3, tmp4, tmp5;

tmp4=0;
for (tmp3=0;tmp3<29;tmp3++) { // struktura ma 29 bajtów (0..2Cool

Struktura ma sizeof(std_code) bajtów. Tak będzie bezpieczniej. :)

Quote:
tmp5 = HexToDec(g_rs_buf[6+tmp3],g_rs_buf[7+tmp3]); // pobierz 2 znaki
Hexodecymalne z bufora RS i zamień je na liczbę 8bit
memcpy(p_out_code,&tmp5,1); // skopuj pod adres ze wskaźnika (do
elementu struktury) odczytaną liczbę z bufora
p_out_code++; // przesuń wskaźnik na kolejny element struktury

To spowoduje przejście do następnej struktury, nie do następnego bajtu.
Ustaw wskaźnik w [1] jako: char * p_std_code
i w [2] p_std_code = (char *) &std_code.

Quote:
tmp4 =+ 2;
}

Ze wskaźnikami u mnie nie za dobrze :/ więc może być w moim toku myślenia
błąd (nawet duży).


Podsumowując:
- tak czy inaczej użyłbym '.' lub '->' jak normalny czarny człowiek.
- zrób coś z tymi tmp3, tmp4 i tmp5 bo jak się na nie patrzy to zęby
bolą... ;-)

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:230B ]
[ 08:38:50 user up 11343 days, 20:33, 1 user, load average: 0.06, 0.06, 0.06 ]

The fortune '$ rm -r $HOME' could be extremely unsettling!!

Waldemar
Guest

Wed May 16, 2007 10:59 am   



Artur M. Piwko schrieb:
Quote:

Podsumowując:
- tak czy inaczej użyłbym '.' lub '->' jak normalny czarny człowiek.
- zrób coś z tymi tmp3, tmp4 i tmp5 bo jak się na nie patrzy to zęby
bolą... Wink

dobrym, legalnym i dość przejrzystym rozwiązaniem jest stosowanie union.
Coś w rodzaju:

typedef struct {
uint8 p0;
uint8 p1;
uint8 p2;
uint8 p3;
uint8 p4;
....
uint8 pxx;
} tStr;

typedef union {
tStr struktura;
uint8 tablica[sizeof(tStr)];
} tBuba;

tBuba buba;

wtedy możesz wchodzić na np pole nr 5 poprzez buba.struktura.p5 lub
buba.tablica[5];

Waldek

Artur M. Piwko
Guest

Wed May 16, 2007 12:41 pm   



In the darkest hour on Wed, 16 May 2007 11:59:23 +0200,
Waldemar <waldemar@zedat.fu-berlin.de> screamed:
Quote:
Podsumowując:
- tak czy inaczej użyłbym '.' lub '->' jak normalny czarny człowiek.
- zrób coś z tymi tmp3, tmp4 i tmp5 bo jak się na nie patrzy to zęby
bolą... ;-)

dobrym, legalnym i dość przejrzystym rozwiązaniem jest stosowanie union.
Coś w rodzaju:

typedef struct {
...
uint8 pxx;
} tStr;

typedef union {
tStr struktura;
uint8 tablica[sizeof(tStr)];
} tBuba;

tBuba buba;

wtedy możesz wchodzić na np pole nr 5 poprzez buba.struktura.p5 lub
buba.tablica[5];


W przypadku GCC można zrobić znacznie prościej - użyć atrybutu 'packed':

struct foobar
{
uint8 foo1;
uint8 bar2;
} __attribute__((packed));


Artur

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:225B ]
[ 13:06:08 user up 11343 days, 1:01, 1 user, load average: 0.06, 0.06, 0.06 ]

Dead Atheist: All dressed up and nowhere to go!

Przemysław Szeremiota
Guest

Wed May 16, 2007 3:09 pm   



Użytkownik "Artur M. Piwko" <pipene-news@pu.kielce.pl> napisał w
wiadomości news:slrnf4lpgl.f73.pipene-news@beast.tu.kielce.pl...
Quote:
Coś w rodzaju:

typedef struct {
...
uint8 pxx;
} tStr;

typedef union {
tStr struktura;
uint8 tablica[sizeof(tStr)];
} tBuba;

tBuba buba;

wtedy możesz wchodzić na np pole nr 5 poprzez buba.struktura.p5 lub
buba.tablica[5];


W przypadku GCC można zrobić znacznie prościej - użyć atrybutu
'packed':

struct foobar
{
uint8 foo1;
uint8 bar2;
} __attribute__((packed));


A jak to działa? Atrybut 'packed' wymusza najciaśniejsze możliwe
wyrównanie pól w pamięci, co to ma wspólnego z unią? foo1 nie zajdzie
przecież na bar2...


Pozdrawiam,
Przemysław Szeremiota

Przemysław Szeremiota
Guest

Wed May 16, 2007 3:38 pm   



Użytkownik "Saper/nolin11" <nolin11_USUNT_TO@interia.pl> napisał w
wiadomości news:f2d1fn$mks$1@news.dialog.net.pl...
Quote:
Witam,

Mam problem z przypisaniem bajtu pod adres po przesunięciu wskaźnika.
I tak mam zadeklarowane strukture:
EE_STD_CODE std_code;
EE_STD_CODE *p_std_code;
I trochę dalej w kodzie przypisuje do wskaźnika strukturę:

p_std_code = &std_code;

I ażeby szybciej ładować dane do struktury chcę zapisywać pod
poszczególne
elementy struktury przrz przesunięcie wkaźnika wygryzmoliłem coś
takiego
ale nie działa :/ :

//uint8_t tmp3, tmp4, tmp5;

tmp4=0;
for (tmp3=0;tmp3<29;tmp3++) { // struktura ma 29 bajtów (0..2Cool
tmp5 = HexToDec(g_rs_buf[6+tmp3],g_rs_buf[7+tmp3]); // pobierz 2
znaki
Hexodecymalne z bufora RS i zamień je na liczbę 8bit
memcpy(p_out_code,&tmp5,1); // skopuj pod adres ze wskaźnika (do
elementu struktury) odczytaną liczbę z bufora
p_out_code++; // przesuń wskaźnik na kolejny element struktury
tmp4 =+ 2;
}


Jeśli miało być _szybciej_, to nie wyszło Smile.

Sorry, ale wywołanie memcpy() dla jednego bajta to trochę przegięcie --
nie wystarczy przypisać (((char *)p_out_code)[tmp3] = tmp5;)? Do tego
równolegle do licznika pętli masz inkrementację wskaźnika, zbędną przy
powyższym przypisaniu, a to ona rozwala Ci przesunięcia wskaźnika Smile.
Inne błędy wytknęli już koledzy Smile.

Pozdrawiam,
Przemysław Szeremiota

Przemysław Szeremiota
Guest

Wed May 16, 2007 3:41 pm   



Użytkownik "Artur M. Piwko" <pipene-news@pu.kielce.pl> napisał w
wiadomości news:slrnf4m4n6.f73.pipene-news@beast.tu.kielce.pl...
Quote:
In the darkest hour on Wed, 16 May 2007 16:09:13 +0200,
Przemysław Szeremiota <przemeksWYWALTO@TOTEZicpnet.pl> screamed:
struct foobar
{
uint8 foo1;
uint8 bar2;
} __attribute__((packed));


A jak to działa? Atrybut 'packed' wymusza najciaśniejsze możliwe
wyrównanie pól w pamięci, co to ma wspólnego z unią? foo1 nie
zajdzie
przecież na bar2...


Atrubut packed wymusza niewypełnianie struktury bajtami paddingu,
w sytuacji w której procesor wymaga wyrównania adresu pamięci dla
określonego typu danych. Akurat w przypadku ośmiobitowców jest to
bez znaczenia, ale pisałem generalnie.

Zgadza się,

Quote:
Podałem ten przykład jako modyfikację oryginalnej metody autora
(nadal trzeba używać wskaźnika do char *), nie jako zamiennik
uni 1:1.

Aa, oryginalnej metody autora -- dobrze, bo już zacząłem się marszczyć
Smile.

Pozdrawiam,
Przemek Szeremiota

Artur M. Piwko
Guest

Wed May 16, 2007 3:42 pm   



In the darkest hour on Wed, 16 May 2007 16:09:13 +0200,
Przemysław Szeremiota <przemeksWYWALTO@TOTEZicpnet.pl> screamed:
Quote:
struct foobar
{
uint8 foo1;
uint8 bar2;
} __attribute__((packed));


A jak to działa? Atrybut 'packed' wymusza najciaśniejsze możliwe
wyrównanie pól w pamięci, co to ma wspólnego z unią? foo1 nie zajdzie
przecież na bar2...


Atrubut packed wymusza niewypełnianie struktury bajtami paddingu,
w sytuacji w której procesor wymaga wyrównania adresu pamięci dla
określonego typu danych. Akurat w przypadku ośmiobitowców jest to
bez znaczenia, ale pisałem generalnie.
Podałem ten przykład jako modyfikację oryginalnej metody autora
(nadal trzeba używać wskaźnika do char *), nie jako zamiennik
uni 1:1.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:235B ]
[ 16:14:13 user up 11343 days, 4:09, 1 user, load average: 0.06, 0.06, 0.06 ]

So when I die, the first thing I will see in heaven is a score list?

Artur M. Piwko
Guest

Wed May 16, 2007 3:42 pm   



In the darkest hour on Wed, 16 May 2007 16:09:13 +0200,
Przemysław Szeremiota <przemeksWYWALTO@TOTEZicpnet.pl> screamed:
Quote:
struct foobar
{
uint8 foo1;
uint8 bar2;
} __attribute__((packed));


A jak to działa? Atrybut 'packed' wymusza najciaśniejsze możliwe
wyrównanie pól w pamięci, co to ma wspólnego z unią? foo1 nie zajdzie
przecież na bar2...


Atrubut packed wymusza niewypełnianie struktury bajtami paddingu,
w sytuacji w której procesor wymaga wyrównania adresu pamięci dla
określonego typu danych. Akurat w przypadku ośmiobitowców jest to
bez znaczenia, ale pisałem generalnie.
Podałem ten przykład jako alternatywę (nadal trzeba używać wskaźnika
do char *), nie jako zamienni uni 1:1.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:235B ]
[ 16:14:13 user up 11343 days, 4:09, 1 user, load average: 0.06, 0.06, 0.06 ]

So when I die, the first thing I will see in heaven is a score list?

Artur M. Piwko
Guest

Wed May 16, 2007 4:42 pm   



In the darkest hour on Wed, 16 May 2007 16:38:25 +0200,
Przemysław Szeremiota <przemeksWYWALTO@TOTEZicpnet.pl> screamed:
Quote:
Jeśli miało być _szybciej_, to nie wyszło Smile.

Sorry, ale wywołanie memcpy() dla jednego bajta to trochę przegięcie --
nie wystarczy przypisać (((char *)p_out_code)[tmp3] = tmp5;)?

Czasami w sigu losuje mi się taki (super;) "oneliner":

int i ; memset( &i, 0, sizeof(int) );

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:225B ]
[ 17:20:41 user up 11343 days, 5:15, 1 user, load average: 0.06, 0.06, 0.06 ]

Performance proven: It works through beta test.

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie przesuwać wskaźnik i przypisywać bajty do elementów struktury w AVR-GCC?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map