Typy v C++

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Pátek Leden 14 18:00:35 CET 2022


Podle me je to chyba prekladace, kdyz nechci mit warningy, tak to proste 
jako parametr printf/scanf pretypuju. Asi to hlidani jde i nejakou 
direktivou vypnout.

Dne 14.01.2022 v 17:36 Pavel Kutina napsal(a):
> A dodatek - to je fajn, že mi to říká tím, že mi ukazuje na datový typ 
> něčeho jiného :)
>
> Proč to tedy s unsigned int projde a s uint32_t ne? Kde je ten rozdíl, 
> který nevidím?
>
> Pavel Kutina
>
> ----- Original Message ----- From: "Jindroush" <jindroush na seznam.cz>
> To: "HW-news" <hw-list na list.hw.cz>
> Sent: Friday, January 14, 2022 5:19 PM
> Subject: Re: Typy v C++
>
>
> Ale ten komplikator tam napovida, ze misto %X pouzit treba %lX a je
> vymalovano.
> Ostatne, nebylo by lepsi pouzit strtoul, ja mam z toho sscanfu vzdycky
> takovy nepekny pocity?
> J.
>
> On 14.01.2022 17:12, Pavel Kutina wrote:
>> Už jsem to dohledal:
>>
>> ////unsigned int cnt = 0; // tohle je bez výhrad
>> uint32_t cnt = 0;
>> sscanf(pData, "%X", &cnt);
>>
>> ../src/receive.cpp:117:19: warning: format '%X' expects argument of 
>> type 'unsigned int*', but argument 3 has type 'uint32_t*' {aka 'long 
>> unsigned int*'} [-Wformat=]
>> 117 | sscanf(pData, "%X", &cnt);
>> | ~^ ~~~~
>> | | |
>> | | uint32_t* {aka long unsigned int*}
>> | unsigned int*
>> | %lX
>>
>>
>> Pokud to deklaruju jako 16bit:
>>
>> uint16_t cnt = 0;
>> sscanf(pData, "%X", &cnt);
>>
>> ../src/receive.cpp:117:19: warning: format '%X' expects argument of 
>> type 'unsigned int*', but argument 3 has type 'uint16_t*' {aka 'short 
>> unsigned int*'} [-Wformat=]
>> 117 | sscanf(pData, "%X", &cnt);
>> | ~^ ~~~~
>> | | |
>> | | uint16_t* {aka short unsigned int*}
>> | unsigned int*
>> | %hX
>>
>>
>> Jinak to je pro STM32L471, máme ještě pár kousků "z předválečných 
>> zásob".
>>
>> Pavel Kutina
>>
>>
>> ----- Original Message ----- From: "Tomáš Hamouz" 
>> <konfery.tomas.hamouz na seznam.cz>
>> To: "HW-news" <hw-list na list.hw.cz>
>> Sent: Friday, January 14, 2022 5:01 PM
>> Subject: Re: Typy v C++
>>
>>
>> A nebyl to pointer na unsigned? Pokud bys tam strčil *uint16_t tak by
>> došlo k přepsání dat.
>>
>> Jinak délka int a unsigned int jsou implementačně závislé, musí jen
>> platit že
>>
>> sizeof(short) <= sizeof(int) <= sizeof(long)
>>
>> Všimni si že short může být stejně dlouhý jako long a bude to podle
>> normy ;-)
>>
>> Tomáš
>>
>>
>>
>>> No nezbývá, než se naučit dávat si na to bacha :(
>>
>>> A ten rozdíl mezi unsigned int a uint16_t (uint8_t, uint32_t atd.) taky
>>> někdo umíte vysvětlit? Vyřval mne sscanf a tam jsem tio vzdal a 
>>> příslušnou
>>> proměnnou deklaroval jako unsigned int (bohužel přslušná část kódu 
>>> prošla
>>> demolicí, teď to nedokážu zrekonstruovat).
>>
>>> Jinak jaké je doporušení? Pro mne je deklarace přes ty přetypované _t
>>> přehlednější, ale nejspíš to nemusí být vždycky totéž.
>>
>>> Pavel Kutina
>>
>>
>>> ----- Original Message ----- From: "Jindroush" <jindroush na seznam.cz>
>>> To: "HW-news" <hw-list na list.hw.cz>
>>> Sent: Friday, January 14, 2022 4:30 PM
>>> Subject: Re: Typy v C++
>>
>>
>>> odpoved uz dosla s vysvetlenim... Jinak jsem to nacpal do
>>> https://cppinsights.io/
>>
>>> a zaskrtl, at ukaze implicitni konverze, tam je to videt na vlastni 
>>> voko
>>> if((static_cast<unsigned int>(static_cast<int>(LastCounter) + 1)) == 
>>> cnt) {
>>
>>> On 14.01.2022 16:13, Pavel Kutina wrote:
>>>> Zdravím,
>>>>
>>>> opět něco nechápu, můžete mne poštouchnout?
>>>>
>>>> Píšu FW v STM Cube, mám deklarované dvě proměnné:
>>>>
>>>> unsigned int cnt = 0;
>>>> uint16_t LastCounter = 0;
>>>>
>>>> při porovnání v:
>>>>
>>>> if (LastCounter+1 == cnt)
>>>>
>>>> mi to píše warning:
>>>> ../src/receive.cpp:129:22: warning: comparison of integer 
>>>> expressions of
>>>> different signedness: 'int' and 'unsigned int' [-Wsign-compare]
>>>> 129 | if ( (LastCounter+1) == cnt)
>>>> | ~~~~~~~~~~~~~~^~~~~~
>>>>
>>>> Chápu dobře, že unsigned int a uint16_t nejsou znaménkově kompatibilní
>>>> typy? Proč ne?
>>>>
>>>> Na něco podbného jsem narazil před chvílí u sscanf, kde se mi to zase
>>>> vztekalo pri použití uint16_t (jsem tam měl) místo unsigned int 
>>>> (který to
>>>> chtělo).
>>>>
>>>> Popravdě, asi 90% času tohoto projektu trávím rovnáním datových typů,
>>>> hodne v tom plavu :(
>>>>
>>>> Díky.
>>>>
>>>> Pavel Kutina
>>>>
>>>> _______________________________________________
>>>> 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