C _ jak rozepsat řádek
Josef Štengl
ok1ced na nagano.cz
Sobota Duben 27 19:39:36 CEST 2013
čte se to od nejvnitřejší závorky z leva do prava. Někdy to není
jednoduché najít :-)
pro jednodušší konstrukce existuje prográmek
cdecl
který vám to rozepíše do „lidštiny“.
Ale je to jen pro starší C standard známý jako ANSI C. Ale je v těchto
případech užitečný.
ced
Dne 27.4.2013 18:48, Miroslav Draxal napsal(a):
> 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 <http://www.HW.cz>
>> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz <http://www.HW.cz>
> Hw-list na list.hw.cz <mailto: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
>
>
> _______________________________________________
> 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