Alternativni UNIX systemy - BSD

Dalibor Straka dast na panelnet.cz
Sobota Leden 13 22:16:24 CET 2007


On Sat, Jan 13, 2007 at 09:59:13PM +0100, Jan Kasprzak wrote:
> Libor Chocholaty wrote:
> : Ja bych ho ocenil i verejne. Nepomohl by nejakym zpusobem union?
> : Neco jako
> : typedef union {
> :     uint32_t *ptr32;
> :     unsigned char *ptr_uchar;
> : } ptr_union;
> : 
> 	Tam nejde o pretypovani toho pointeru, ale o to, co psal Martin
> Mares: procesor proste nemusi fyzicky umet ten 4-bajtovy uint32_t nacist
> z adresy, ktera neni delitelna ctyrmi. Norma jazyka C s tim pocita,
> a takoveto konverze nepovoluje.
> 
> 	Samozrejme muzete mit union z uint32_t a unsigned charu,
> a mit pole takovychto unionu (kde kazdy char bude teda zacinat na adrese
> delitelne ctyrmi). Nebo to memcpy a podobna magie (pouzit pointer na char,
> a teprve ten ziskany char pretypovat na uint32_t).
> 
Zalezi na povaze dat. Ku prikladu vyse uvedeny union nelze v mem pripade
pouzit, protoze se pole plni volanim read(sock, buf, size). Problem
nastava pri cteni z buf, protoze protokol ma specifikovano:
<uint32_t><unsigned char><uint32_t>
Nicmene i toto se da docela korektne obejit, jak mi ukazal pedantsky
cvicici, volbou vhodnejsi datovych struktur a nectenim paketu najednou.

-- Dalibor Straka


Další informace o konferenci Linux