[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

rzutowanie int na char*

buke

5/18/2007 6:44:00 AM

Witam mam pytanie dla znawcow kompilatorow:

void fun( char* buf )
{
....
char a = buf[0];
char b = buf[1];
}

a wywoluje funkcje w sposob:

....
int iDane = 0x4321;
void fun( &iDane );
....

Pytanie:
Czy poprawnie zostanie zrzutowany integer na wskaznik , tak ze funckja fun
spowoduje nastepujacew dzialanie:

buf[0] = 0x21
buf[1] = 0x43

czy zalezy to od LITTLE/BIG ENDIAN ustawionych w danym kompilerze?

Wedlug mnie rzutowanie zmiennej na wskaznik to poprostu zwrocenie
poczatkowgo a wiec MNIEJSZEGO adresu zmiennej, wiec kompilator nie patrzy
czy jest to LSB/MSB takiego integer'a.... Wtedy przy innym kompilatorze kod
dziala nie zgodnie z zalozeniami programisty...


Dzieki


3 Answers

Kamil Burzynski

5/18/2007 6:58:00 AM

0

On Fri, 18 May 2007 08:44:15 +0200
"buke" <wytnijto_cubah@tlen.pl> wrote:

> Witam mam pytanie dla znawcow kompilatorow:
>
> void fun( char* buf )
> {
> ...
> char a = buf[0];
> char b = buf[1];
> }
>
> a wywoluje funkcje w sposob:
>
> ...
> int iDane = 0x4321;
> void fun( &iDane );
> ...
>
> Pytanie:
> Czy poprawnie zostanie zrzutowany integer na wskaznik , tak ze funckja fun
> spowoduje nastepujacew dzialanie:
>
> buf[0] = 0x21
> buf[1] = 0x43
>
> czy zalezy to od LITTLE/BIG ENDIAN ustawionych w danym kompilerze?

Zalezy od big/little endian. Ale to nie kompilator ustala endiany tylko
procesor. A kompilator musi miec zgodne endiany z procesorem na ktory
kompiluje. Innymi slowy ten sam kod skompilowany tym samym kompilatorem
na inny procesor moze dac inny wynik. W Twoim przypadku mozesz dostac
0x21/0x43 albo np. 0x00, 0x00. Albo 0x43/0x21. A jakby sie uprzec to
jeszcze pare innych kombinacji.

> Wedlug mnie rzutowanie zmiennej na wskaznik to poprostu zwrocenie
> poczatkowgo a wiec MNIEJSZEGO adresu zmiennej

Co to jest rzutowanie zmiennej na wskaznik? O jaka zmienna Ci chodzi?
Zdaje sie, ze miales na mysli cos w stylu 'rzutowanie adresu zmiennej
na wskaznik' - tylko ze tam nie trzeba rzutowac nic (bo adres mozna
wpisac wprost do wskaznika).

> , wiec kompilator nie patrzy
> czy jest to LSB/MSB takiego integer'a....

Nie patrzy, bierze namniejszy adres. Ale pod tym adresem moze byc
najmlodszy albo najstarszy bajt liczby.

> Wtedy przy innym kompilatorze kod
> dziala nie zgodnie z zalozeniami programisty...

To oznacza tylko tyle ze programista jest do kitu i ze ma zle zalozenia.

PS. Rzutowanie wskaznikow z int* na char* i odwrotnie (oraz innych
typow) az sie prosi o klopoty. Np. taki kod:

char c;
char *p1 = &c;
int *p2 = (int*)p1;
char *p3 = (char*)p2;

moze na niektorych (wcale nie egzotycznych) kompilatorach dac inna
wartosc w p1 niz w p3. I jest to poprawne zachowanie - standardy C/C++
na to pozwalaja. Jesli programista poczyni zalozenie ze p1 == p3, to
juz jego problem.

--
Best regards from
Kamil Burzynski

buke

5/18/2007 7:05:00 AM

0


Uzytkownik "Kamil Burzynski" <K.Burzynski@usunto.adbglobal.com> napisal w
wiadomosci news:20070518085813.3dc6d4dc@kburzynski1.adbgroup.pl...
> On Fri, 18 May 2007 08:44:15 +0200
> "buke" <wytnijto_cubah@tlen.pl> wrote:
>
>> Witam mam pytanie dla znawcow kompilatorow:
>>
>> void fun( char* buf )
>> {
>> ...
>> char a = buf[0];
>> char b = buf[1];
>> }
>>
>> a wywoluje funkcje w sposob:
>>
>> ...
>> int iDane = 0x4321;
>> void fun( &iDane );
>> ...
>>
>> Pytanie:
>> Czy poprawnie zostanie zrzutowany integer na wskaznik , tak ze funckja
>> fun
>> spowoduje nastepujacew dzialanie:
>>
>> buf[0] = 0x21
>> buf[1] = 0x43
>>
>> czy zalezy to od LITTLE/BIG ENDIAN ustawionych w danym kompilerze?
>
> Zalezy od big/little endian. Ale to nie kompilator ustala endiany tylko
> procesor. A kompilator musi miec zgodne endiany z procesorem na ktory
> kompiluje. Innymi slowy ten sam kod skompilowany tym samym kompilatorem
> na inny procesor moze dac inny wynik. W Twoim przypadku mozesz dostac
> 0x21/0x43 albo np. 0x00, 0x00. Albo 0x43/0x21. A jakby sie uprzec to
> jeszcze pare innych kombinacji.
>

tak tez myslalem, chce zrobic kod multiplatform czyli na rozne procki...

>> Wedlug mnie rzutowanie zmiennej na wskaznik to poprostu zwrocenie
>> poczatkowgo a wiec MNIEJSZEGO adresu zmiennej
>
> Co to jest rzutowanie zmiennej na wskaznik? O jaka zmienna Ci chodzi?
> Zdaje sie, ze miales na mysli cos w stylu 'rzutowanie adresu zmiennej
> na wskaznik' - tylko ze tam nie trzeba rzutowac nic (bo adres mozna
> wpisac wprost do wskaznika).

zle sie wyslowilem, faktycznie mi chodzilo o adres zmiennej na char
pointer...
>
>> , wiec kompilator nie patrzy
>> czy jest to LSB/MSB takiego integer'a....
>
> Nie patrzy, bierze namniejszy adres. Ale pod tym adresem moze byc
> najmlodszy albo najstarszy bajt liczby.

wlasnie o taka odpowiedz mi chodzilo dziekuje:)

>
>> Wtedy przy innym kompilatorze kod
>> dziala nie zgodnie z zalozeniami programisty...
>
> To oznacza tylko tyle ze programista jest do kitu i ze ma zle zalozenia.
>

czyli kod ktory przegladam wlasnie pisal taki "ktos"...
jeszcze raz thx

> PS. Rzutowanie wskaznikow z int* na char* i odwrotnie (oraz innych
> typow) az sie prosi o klopoty. Np. taki kod:
>
> char c;
> char *p1 = &c;
> int *p2 = (int*)p1;
> char *p3 = (char*)p2;
>
> moze na niektorych (wcale nie egzotycznych) kompilatorach dac inna
> wartosc w p1 niz w p3. I jest to poprawne zachowanie - standardy C/C++
> na to pozwalaja. Jesli programista poczyni zalozenie ze p1 == p3, to
> juz jego problem.
>
> --
> Best regards from
> Kamil Burzynski


Kamil Burzynski

5/18/2007 7:07:00 AM

0

On Fri, 18 May 2007 09:04:31 +0200
"buke" <wytnijto_cubah@tlen.pl> wrote:

> >> czy zalezy to od LITTLE/BIG ENDIAN ustawionych w danym kompilerze?
> >
> > Zalezy od big/little endian. Ale to nie kompilator ustala endiany tylko
> > procesor. A kompilator musi miec zgodne endiany z procesorem na ktory
> > kompiluje. Innymi slowy ten sam kod skompilowany tym samym kompilatorem
> > na inny procesor moze dac inny wynik. W Twoim przypadku mozesz dostac
> > 0x21/0x43 albo np. 0x00, 0x00. Albo 0x43/0x21. A jakby sie uprzec to
> > jeszcze pare innych kombinacji.
> >
>
> tak tez myslalem, chce zrobic kod multiplatform czyli na rozne procki...

ntohl(), htonl() - dane przekazujesz zawsze w formacie 'networkowym' i
juz.

--
Best regards from
Kamil Burzynski