RE: C _ jak rozepsat řádek

Miroslav Draxal evik na volny.cz
Sobota Duben 27 18:48:33 CEST 2013


Díky, tohle funguje,

Na štábní kultuře zapracuji, v tomto projektu již nechám sprasenou. 

S těmi ukazateli mam vždy problém, že nějak neumím najít systém, odkud ten řádek mám začít číst. I za 10 let v tom budu plavat. 

 

From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Josef Štengl
Sent: Saturday, April 27, 2013 2:26 PM
To: HW-news
Subject: Re: C _ jak rozepsat řádek

 

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
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



__________ Informace od ESET NOD32 Antivirus, verze databaze 8272 (20130426) __________

Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz



__________ Informace od ESET NOD32 Antivirus, verze databaze 8272 (20130426) __________

Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130427/9b4b8f98/attachment-0001.htm>


Další informace o konferenci Hw-list