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

.
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

.
Inne błędy wytknęli już koledzy

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

.
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

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