*****SPAM***** RE: C _ jak rozepsat řádek

Josef Štengl ok1ced na nagano.cz
Sobota Duben 27 21:55:22 CEST 2013


Vám je to jasné, ostatním na druhé straně to tak jasné být nemusí. 
Setkal jsem se s dokumenty, kde word/dword  16/32, 32/64 a to dokonce v 
jednou dokumentu v závislosti na cílové platformě/sběrnici. A bylo to 
správně a dokumentované.

GCC je známý kompilátor, ale profesionálně jsem dělal se 4 dalšími a ty 
nebyli GCC kompatibilní jak parametry překladače, atributy a ani 
pragmami. Endianita není předepsaná, pokud píšete nízkoúrovňové věci či 
knihovny například pro ARM nebo MIPS nebo něco neznámého a nevíte jaká 
endianita bude nakonec použita.

Win platforma je možná zřejmá, neznám, ale já dělám převážně embedded 
záležitosti (dnes nazývané deeply embedded) a tam je jasná jedna věc.

Váš pohled se mi jeví omezený až bych řekl arogantní. Jen jsem chtěl 
upozornit i na jiný pohled na problematiku. Rozčilují mě takové jasné 
věci, které jsou jasné všem. A ouha. Někomu je to jasné jinak.

Pokud to nesplňuje normy a doporučení, tak jste to psal zbytečně a 
nedostanete zaplaceno. Jasné je jen to co je napsáno v normě a ve 
specifikaci.

Jen špatné zkušenosti ;-).


Dne 27.4.2013 20:55, Jaroslav Buchta napsal(a):
> Tak snad je jasne, co mam na mysli - 8, 16, 32b
> A uz jsem do ruznych projektu vkladal spustu zdrojaku z ruznych
> platforem a nikdy s tim nebyl vetsi problem, pokud to bylo rozumne
> napsano. Zvolit ENDIAN, zarovnani byva taky nejak preddefinovano,
> naklonec ja uz beru za standard GCC, protoze v tom prekladam uz
> prakticky pro vsechny MCU. Ve win uz radsi C#, proc si komplikovat zivot
> ;-)
>
> Dne 27. 4. 2013 19:31, Josef Štengl napsal(a):
>> Ne, je.
>>
>> BYTE, WORD, DWORD - nevím co tím myslíte. Takové typy C nezná. A já
>> vždycky nevím, kolik bitů ten word je. Někdy 16, někdy 32, záleží na
>> šířce registrů nebo sběrnice a s kým se bavíte. Tyto typy nejsou
>> obecně specifikovány.
>>
>> Makra align jako takové v C neexistují, pokud si je nevytvoříte a
>> pokud máte na mysli atributy či pragmy, tak ty jsou silně závislé na
>> překladačích. Pokud programuje na více cílových platforem a pro více
>> překladačů, je to kraj zapovězený a vstoupit to něj smí jen lidé znalí
>> a jen když je to nezbytně nutné.
>>
>> Nejde o to jestli je to implementováno víceméně stejně, jde o to že to
>> není standardizováno a je to implementováno víceméně stejně.
>>
>> Zrovna bitová pole jsou závislá na endianitě. S tím LSB máte pravdu,
>> ale problém je, že to LSB je pokaždé na jiné straně, což se může být
>> problém v komunikaci s perifériemi, které jsou většinou v malých
>> indiánech a převádí se podle nastavení procesoru. Pokud píšete
>> ovladače na konkrétní zařízení, je možná pouze jedna endianita a
>> nemusí mít SIL nebo ASIL tak to vem čert, ale pokud máte procesor
>> biendian a nevíte jestli se to bude překládat pro malé nebo velké
>> indiány, tak jste a) v jednom případě v průseru b) obklíčen #ifdefy a
>> stejně máte možný skrytý problém s jiným překladačem.
>>
>> Obecně výskyt union je známkou špatné programovací techniky. Až na
>> vyjímky a ty poznáte, jsou to většinou nádherné a účelově vymyšlené
>> konstrukce.
>>
>>
>> ced
>>
>> Dne 27.4.2013 18:53, Jaroslav Buchta napsal(a):
>>> Nevim jak s bitovymi poli ale union pro pristyp BYTE, WORD, DWORD... se
>>> vidi celkem bezne, da se to osetrit ruznumi makry ALIGN.... xxxENDIAN...
>>> aby to bylo univerzalne prenositelne a je to OK. Zas takovy bordel v
>>> ruznych implementacich neni a funguje to celkem stabilne (bitova pole by
>>> se taky mela postupne umistovat do standardniho typu (int) od LSB ve
>>> vsech implementacich, ne? )
>>>
>>> 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 bywww.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
>> _______________________________________________
>> 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


Další informace o konferenci Hw-list