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