Jump to content
    

sprintf - Warning[Pa205]: implicit conversion from float to double

//*.cpp
float pi = 3.14;
char str[100];
sprintf(str, "%f", pi);

На sprintf() получаю предупреждение Warning[Pa205]: implicit conversion from float to double

До этого работал в IAR 8.5. всегда в %f подсовывал float, ни каких предупреждений. В кубеИде с gcc тоже нет такого предупреждения. В IAR 9.4 - это мой первый проект и вот такое получил. 

ну во первых, не хочу этот ворнинг, его конечно можно заглушить декертивами или настройками, или явным приведением типа к double. Но что-то не очень нравиться работать с double, т.к. МК имеет FPU single precision.

Share this post


Link to post
Share on other sites

1. Заимейте привычку указывать после float-констант букву f 🙂

2. Сослаться на конкретные пруфы не могу, но вроде бы printf все равно внутри себя повышает все float в double, так что с double все равно придется иметь дело. Так что, наверное, самый простой способ - явно привести аргумент к double:

sprintf(str, "%f", (double)pi);

 

Share this post


Link to post
Share on other sites

10 минут назад, AndyBig сказал:

Заимейте привычку указывать после float-констант букву f

а кто сказал что у меня нет такой привычки? написал для ПРИМЕРА. Изначально был такой пример
 

float pi;
sprintf(str, "%f", pi);

Но подумал: щя найдется учитель, который будет учить инициализировать переменные перед использованием. Или спросит "а что такое str?". Немного доработал пример... но всё равно "занавеска" кому-то не угодила )). можно ещё и про snprintf(str, 100, ...) вспомнить для str[100].

 

По делу, вопрос остался: почему в IAR 8,5 нет предупреждения, а в 9.4 есть в одном проекте есть предупреждение, в другом нет? Почему в iccarm есть предупреждение, а в gcc нет?

Share this post


Link to post
Share on other sites

1 hour ago, razrab83 said:

На sprintf() получаю предупреждение Warning[Pa205]: implicit conversion from float to double

IAR 9.30.1 for ARM регулярно выдаёт такие предупреждения.

Решение: использую double, либо намеренно преобразую к этому типу любой иной тип, в т.ч. и float.

image.png.5390ed3d91a810d91c2f272921249304.png

Тут vdac будет иметь тип double при инициализации.

P.S. В опциях компилятора стоит флаг --warnings_are_errors, поэтому предупреждения в моём проекте недопустимы.

Share this post


Link to post
Share on other sites

2 hours ago, razrab83 said:

ни каких предупреждений

Настройки компилятора смотрели? Их там много. Скорей всего, по умолчанию этот варнинг теперь разрешен.

Если не указан суффикс "f" после числа с плавающей точкой, то компилятор использует его как double. Посмотрите на код в этой строчке:

float pi = 3.14;

Там будет приведение дабла к флоат с последующим присвоением. Поэтому при разрешённом варнинге на приведения типов компилятор справедливо ругается на эту строку:

sprintf(str, "%f", pi);
Edited by tonyk_av

Share this post


Link to post
Share on other sites

1 час назад, tonyk_av сказал:

Настройки компилятора смотрели? Их там много. Скорей всего, по умолчанию этот варнинг теперь разрешен.

Если не указан суффикс "f" после числа с плавающей точкой, то компилятор использует его как double. Посмотрите на код в этой строчке:

float pi = 3.14;

Там будет приведение дабла к флоат с последующим присвоением. Поэтому при разрешённом варнинге на приведения типов компилятор справедливо ругается на эту строку:

sprintf(str, "%f", pi);
 

ни чего не понял..... при чем тут суффикс f? Суфикс f в строке "float pi = ..."  абсолютно ни как не влияет и не должен влиять на строку со sprintf().

 

1 час назад, tonyk_av сказал:

Если не указан суффикс "f" после числа с плавающей точкой, то компилятор использует его как double. Посмотрите на код в этой строчке:

float pi = 3.14;

Там будет приведение дабла к флоат с последующим присвоением.

все правильно. я записал "3.14" - считай что (double)(3.14). И что? Далее... я записал float pi = (double)(3.14); - в данной строке произошло неявное преобразование из double во float. Далее pi везде есть float. После, как инициализировалась pi - не важно. пусть будет так
 

float pi = reinterpret_cast<float>(getMyFloat());
float pi = 3.14;
float pi = (float)atof("3.14");
float pi = 3.14f;
float pi = sinf(1);

Выбери любой инит по душе. При чем тут вообще неявное преобразование в строке "float pi = 3.14;"? Мне на эту строку компилятор не дает ворнинг. да и если бы давал - да и черт с ним. Меня интересует ворнинг на sprintf.

От способа инициализации pi результат sprintf не зависит. Ворнинг на sprintf в 9.4 будет, а в 8.5 и в gcc не будет.

 

1 час назад, tonyk_av сказал:

Настройки компилятора смотрели? Их там много. Скорей всего, по умолчанию этот варнинг теперь разрешен.

смотрел. там в 100500 окошках куча галочек. отличий не нашел. НО.... скомпилировал в 9,4 и в 8,5 один и тот же файл и сравнил опции компилятора - опции одинаковые

iccarm.exe file.cpp
-D USE_HAL_DRIVER
-D STM32F429xx
-D HSE_VALUE=((uint32_t)16000000)
-D ewarm
--preprocess=s <path>\ewarm-cm3\Debug\List -o <path>\ewarm-cm3\Debug\Obj
--no_cse
--no_unroll
--no_inline
--no_code_motion
--no_tbaa
--no_clustering  
--no_scheduling
--debug
--endian=little
--cpu=Cortex-M4 -e
--fpu=VFPv4_sp
--dlib_config <path>\arm\inc\c\DLib_Config_Normal.h -On
--c++
--no_exceptions

но в 9.4 есть ворнинг на sprintf, а в 8.5 нет.

2 часа назад, haker_fox сказал:

IAR 9.30.1 for ARM регулярно выдаёт такие предупреждения.

Может в IAR 9-ке добавили этот ворнинг? В gcc версии arm-none-eabi-g++ (GNU Arm Embedded Toolchain 10.3-2021.08) 10.3.1 20210621 (rel ease) тоже нет ворнинга.

Share this post


Link to post
Share on other sites

On 1/30/2024 at 1:49 PM, razrab83 said:

В gcc версии arm-none-eabi-g++ (GNU Arm Embedded Toolchain 10.3-2021.08) 10.3.1 20210621 (rel ease) тоже нет ворнинга.

А вы в GCC включите все предупреждения, что-то вроде -Wall.

Еще можно употребить ключик -pedantic.
Или оба сразу.

Share this post


Link to post
Share on other sites

7 минут назад, dimka76 сказал:

А вы в GCC включите все предупреждения, что-то вроде -Wall.

Еще можно употребить ключик -pedantic.
Или оба сразу.

включены, оба сразу. предупреждений нет.

Share this post


Link to post
Share on other sites

On 1/30/2024 at 2:11 PM, razrab83 said:

включены, оба сразу. предупреждений нет.

попробуйте -Wformat

Share this post


Link to post
Share on other sites

6 минут назад, dimka76 сказал:

-Wformat

с -Wformat предупреждения в gcc нет.

7 минут назад, dimka76 сказал:

попробуйте

Вы сами попробуйте.

Share this post


Link to post
Share on other sites

4 hours ago, razrab83 said:

До этого работал в IAR 8.5

На сайте ИАР есть руководство по переезду с 8 на 9 и там есть упоминание об использовании. float и double. У меня провайдер блокирует VPN, поэтому я не могу прочитать об этом.

42 minutes ago, razrab83 said:

включены, оба сразу. предупреждений нет.

В ГЦЦ есть предупреждения о таком преобразовании. Активность зависит от версии стандарта языка и, видимо, сборки компилятора.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...