buke
5/18/2007 7:05:00 AM
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