C _ jak rozepsat řádek

Josef Štengl ok1ced na nagano.cz
Sobota Duben 27 14:26:25 CEST 2013


On v nich trošku plave skoro každý :-)

To jak máte napsáno „// tohle je OK“, tak to je v pořádku protože 
pracujete s ukazatelem na strukturu, kterou derefenrecujete a 
přistupujete k ní jako ke struktuře resp. přímo k položce struktury. Ten 
typ položky je důležitý, protože položky nazvané Bit[0-7] jsou položky 
bitového pole, a položka bitového pole nemá adresu, takže na něj nelze 
vytvořit ukazatel. Viz pozn. 106 dokumentu n1256: (C99 draft)

The unary & (address-of) operator cannot be applied to a bit-field 
object; thus, there are no pointers to or arrays of bit-field objects.

Takže se pak přes ukazatel snažíte získat adresu položky pole, která je 
ovšem položka bitového pole a ten nemá adresu a skončí to chybou.

Dále jen poznámky pod čarou. Pokud vás rozčílí, tak si jich nevšímejte:

Název unionu začíná podtržítkem, což má jazyk C rezervovaný pro budoucí 
použití. Podtržítka na začátku čehokoliv v aplikačních programech 
nepoužívat!

Zvážil bych použití bitového pole ve stylu

http://c-faq.com/misc/bitsets.html

Jen k tomu mám poznámku, že char by měl být unsigned char, protože by se 
neměly provádět bitové operace na znaménkových typech. Ve velmi 
speciálních případech dostáváme zajímavě nesprávné výsledky.

Vypadá to, že se snažíte mít různý přístup k jednomu místu v paměti s 
využitím typu union. To je z hlediska specifikace C chybně, protože jak 
se ukládají data v položce union je jen a pouze záležitost překladače a 
jinde by to nemuselo fungovat správně (dobrá, to že jsem se s tím ještě 
nesetkal, neznamená že se to prohlásí za standard. Aby to pak nedopadlo 
jak s tím raketoplánem co vybouchl :-)

Pro mě je to příklad toho jak by se to psát nemělo. Jestli mi do toho 
nic není, tak si toho nevšímejte :-D.

Hmm než jsem to dopsal, tak toto od pana Augustýna by mohlo fungovat.

(*pProgEEpr).EndProgram = 1;

Protože se nejprve provede dereference ukazatele na strukturu a pak se 
přistupuje k položce.

Hezký den.


Dne 27.4.2013 12:18, Miroslav Draxal napsal(a):
> Dobrý den
>
> Mějme
>
> char MenuPolozkaSet;
>
> typedef union {
>
>      char value;
>
>      struct {
>
>                 unsigned Bit0 : 1;
>
>                 unsigned Bit1 : 1;
>
>                 unsigned Bit2 : 1;
>
>                 unsigned Bit3 : 1;
>
>                 unsigned Bit4 : 1;
>
>                 unsigned Bit5 : 1;
>
>                 unsigned Bit6 : 1;
>
>                 unsigned Bit7 : 1;
>
>      } Bits;
>
>      struct {
>
>                 unsigned val : 7;
>
>                 unsigned bit_ : 1;
>
>      } ProlnutiPauza;
>
>      struct {
>
>                 unsigned Mesic : 5;
>
>                 unsigned AutoOnOff : 1;
>
>                 unsigned EndProgram : 1;
>
>      };
>
> } _ProgramEEprom;
>
> (*((_ProgramEEprom*) & MenuPolozkaSet)).EndProgram = 1; // tohle je OK
>
> Pokud bych to chtěl rozepsat přes fyzický ukazatel
>
> _ProgramEEprom *pProgEEpr = (_ProgramEEprom*) &MenuPolozkaSet;
>
> *pProgEEpr.EndProgram = 1;
>
> To hází chybu
>
> MenuKey.c:261: error: struct/union required
>
> MenuKey.c:261: error: illegal conversion between types
>
> Což asi chápu, ale jak to napsat. Snažím se tomu přijít na kloub. V těch
> pointerech plavu.
>
>
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 8272
> (20130426) __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list