Typy v C++

Pavel Kutina hw na prelude.cz
Pátek Leden 14 17:12:42 CET 2022


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 



Další informace o konferenci Hw-list