[elektro] A szokásos C kezdő kérdések

Móczik Gábor pm_levlista at progzmaster.hu
Thu Jan 31 09:00:12 CET 2013


2013.01.30. 19:14 keltezéssel, SZIGETI Szabolcs írta:
> Az ilyen unionban egymásra pakolunk adatszerkezeteket dologgal nagyon
> nagyot lehet szívni. Ez már a FORTRAN COMMON BLOCK-kal is jó játék volt, de
> a C-ben semmi sem kötelezi a fordítót, hogy fizikailag ugyanoda kerüljön
> minden. Tehát pl. inteket szeret szóhatárra rakni, igy pl. a
>
> struct {
>    int a;
>    char b;
>    int c;
> };
>
> mérete simán lehet 12 byte egy 32 bites rendszeren, pedig ugye 9-en
> elférne. Különböző fordítókat különböző módon lehet kényszeríteni, hogy ne
> csinálja, de még ekkor is bejöhetnek hardver korlátok (pl. a 68000-es intet
> csak páros címről tudott beolvasni).
>
> Szóval, ha jót akarsz, akkor ezzel nem bűvészkedsz. Inkább megfelelő módon
> (&, |, << stb) alakítsd át char tömbbé az adataidat, és akkor még
> hordozható kódot is fogsz kapni.

Igen, már épp írni akartam az összes előző bitfaragásra, hogy több byte 
méretű változót pointerrel, casttal, unionnal, akármivel bytestream-re 
alakítani architektúra-specifikus. Túl sok a hibalehetőség.
Egyrészt a fordító nyűgjei, hogy hogyan is igazítja a változókat, amit 
ahány fordító, annyiféle direktívával lehet rávenni hogy másképp 
csinálja, de mindig lesz amikor valamiért nem jön össze.
A másik, hogy a processzor amire a kódot fordítod big- vagy 
little-endian. Nem mindegy, hogy a bytestream-et a fogadó oldal big-, 
little- vagy a küldővel megegyező formátumban várja-e...


Bár kényelmes és jól olvasható lenne struct-tal fejléceket deklarálni és 
ezt egy utasítással kiküldeni, elég sok a szívás vele.
Ha nem idő és méretkritkus a kód, akkor sokkal biztonságosabb az 
elemeket egyenként kezelni.



More information about the Elektro mailing list