Перейти к содержанию
    

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первая ссылка из гугла

Or you could just do something like:

printf("%d.%.6d", (int)x, (int)((x-(int)x)*1000000));

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, поэтому предупреждения в моём проекте недопустимы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, razrab83 said:

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

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

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

float pi = 3.14;

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

sprintf(str, "%f", pi);
Изменено пользователем tonyk_av

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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) тоже нет ворнинга.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.
Или оба сразу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

-Wformat

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

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

попробуйте

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, razrab83 said:

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

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

42 minutes ago, razrab83 said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, tonyk_av сказал:

У меня провайдер блокирует VPN, поэтому я не могу прочитать об этом.

EWARM_MigrationGuide.ENU.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...