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

Lajos Rancz lajos.rancz at gmail.com
Wed Jan 30 19:18:12 CET 2013


Helló!

Megint csak egyet kell értsek :)

Üdv


2013. január 30. 19:14 SZIGETI Szabolcs írta, <szigiszabolcs at gmail.com>:

> 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]
> >
> -----------------------------------------
>           elektro[-flame|-etc]
>


More information about the Elektro mailing list