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

SZIGETI Szabolcs szigiszabolcs at gmail.com
Wed Jan 30 19:14:07 CET 2013


Hali!

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.

Szabolcs



2013. január 30. 17:53 Skandar Graun írta, <sgraun at gmail.com>:

> Na, megküzdöttem vele.
> A láncolt listák nagyon szépek, de tökéletesen nem ideillők.
> Jelenleg egy érdekes állapotban leledzik a dolog.
> Ami hiba nélkül lefordult és elsőre nagyjából megy is, az a következő:
>
> typedef union  sertomb
>   {
>           struct
>           {
>           unsigned char kezdet;
>           int act_set_ser;
>           int stb_set_ser;
>           int stat_ser;
>                   unsigned char crcout;
>           };
>   }sertomb;
>
>   sertomb tomb_crc;
>
> A feltöltés és a kivitel:
>
>                         if (kellsoros)
>                         {
>                                 tomb_crc.kezdet = 0x55;
>                                 tomb_crc.act_set_ser = 0x3231;
>                                 tomb_crc.stb_set_ser = 0x3433;
>                                 tomb_crc.stat_ser = 0x3635;
>                                 tomb_crc.crcout = 0x37;
>                                 UART2_PutChar( (unsigned char*) &tomb_crc,
> 8 );
>                                 Uart2_CRLF();
>                                 kellsoros = 0;
>                         }
>
> A kiveteli rutinok:
> void UART2_PutChar( unsigned char *data, unsigned char count )
> {
>         while ( count )
>         {
>                 while(U2STAbits.UTXBF == 1);
>                 U2TXREG = *data++;
>                 count --;
>         }
> }
> void Uart2_CRLF(void)
> {
>                 while(U2STAbits.UTXBF == 1);
>                 U2TXREG = 10;
>                 while(U2STAbits.UTXBF == 1);
>                 U2TXREG = 13;
> }
>
> A processzor pic24f sorozat.
>
> De a végeredmény érdekes:
>
>
> U[00]123456
>
> Ez nekem azt mutatja, hogy hiába tettem be előre egy unsigned char-t
> és utána az int típusokat, a pointer erre tesz nagyívben és mivel a
> kontroller 16 bites, ezért szolgaian viszi ki az alsó-felső byte-okat
> Csak így jelenleg az utolsó char byte-ot nem viszi ki, hiszen
> elfogyott a cuklusváltozó...
> Ha nagyon kell, ezzel már tudok együtt élni, csak nem elegáns...
> Próbáltam union helyett sima struct szerkezettel is, de ugyanezzel az
> eredménnyel.
> Mit kellene csinálni?
>
> -----------------------------------------
>           elektro[-flame|-etc]
>


More information about the Elektro mailing list