razrab83 26 January 30, 2024 Posted January 30, 2024 · Report post //*.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. Quote Share this post Link to post Share on other sites More sharing options...
AndyBig 8 January 30, 2024 Posted January 30, 2024 · Report post 1. Заимейте привычку указывать после float-констант букву f 🙂 2. Сослаться на конкретные пруфы не могу, но вроде бы printf все равно внутри себя повышает все float в double, так что с double все равно придется иметь дело. Так что, наверное, самый простой способ - явно привести аргумент к double: sprintf(str, "%f", (double)pi); Quote Share this post Link to post Share on other sites More sharing options...
MrYuran 34 January 30, 2024 Posted January 30, 2024 · Report post Первая ссылка из гугла Or you could just do something like: printf("%d.%.6d", (int)x, (int)((x-(int)x)*1000000)); Quote Share this post Link to post Share on other sites More sharing options...
razrab83 26 January 30, 2024 Posted January 30, 2024 · Report post 10 минут назад, AndyBig сказал: Заимейте привычку указывать после float-констант букву f а кто сказал что у меня нет такой привычки? написал для ПРИМЕРА. Изначально был такой пример float pi; sprintf(str, "%f", pi); Но подумал: щя найдется учитель, который будет учить инициализировать переменные перед использованием. Или спросит "а что такое str?". Немного доработал пример... но всё равно "занавеска" кому-то не угодила )). можно ещё и про snprintf(str, 100, ...) вспомнить для str[100]. По делу, вопрос остался: почему в IAR 8,5 нет предупреждения, а в 9.4 есть в одном проекте есть предупреждение, в другом нет? Почему в iccarm есть предупреждение, а в gcc нет? Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 77 January 30, 2024 Posted January 30, 2024 · Report post 1 hour ago, razrab83 said: На sprintf() получаю предупреждение Warning[Pa205]: implicit conversion from float to double IAR 9.30.1 for ARM регулярно выдаёт такие предупреждения. Решение: использую double, либо намеренно преобразую к этому типу любой иной тип, в т.ч. и float. Тут vdac будет иметь тип double при инициализации. P.S. В опциях компилятора стоит флаг --warnings_are_errors, поэтому предупреждения в моём проекте недопустимы. Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 71 January 30, 2024 Posted January 30, 2024 (edited) · Report post 2 hours ago, razrab83 said: ни каких предупреждений Настройки компилятора смотрели? Их там много. Скорей всего, по умолчанию этот варнинг теперь разрешен. Если не указан суффикс "f" после числа с плавающей точкой, то компилятор использует его как double. Посмотрите на код в этой строчке: float pi = 3.14; Там будет приведение дабла к флоат с последующим присвоением. Поэтому при разрешённом варнинге на приведения типов компилятор справедливо ругается на эту строку: sprintf(str, "%f", pi); Edited January 30, 2024 by tonyk_av Quote Share this post Link to post Share on other sites More sharing options...
razrab83 26 January 30, 2024 Posted January 30, 2024 · Report post 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) тоже нет ворнинга. Quote Share this post Link to post Share on other sites More sharing options...
dimka76 85 January 30, 2024 Posted January 30, 2024 · Report post 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. Или оба сразу. Quote Share this post Link to post Share on other sites More sharing options...
razrab83 26 January 30, 2024 Posted January 30, 2024 · Report post 7 минут назад, dimka76 сказал: А вы в GCC включите все предупреждения, что-то вроде -Wall. Еще можно употребить ключик -pedantic. Или оба сразу. включены, оба сразу. предупреждений нет. Quote Share this post Link to post Share on other sites More sharing options...
dimka76 85 January 30, 2024 Posted January 30, 2024 · Report post On 1/30/2024 at 2:11 PM, razrab83 said: включены, оба сразу. предупреждений нет. попробуйте -Wformat Quote Share this post Link to post Share on other sites More sharing options...
razrab83 26 January 30, 2024 Posted January 30, 2024 · Report post 6 минут назад, dimka76 сказал: -Wformat с -Wformat предупреждения в gcc нет. 7 минут назад, dimka76 сказал: попробуйте Вы сами попробуйте. Quote Share this post Link to post Share on other sites More sharing options...
dimka76 85 January 30, 2024 Posted January 30, 2024 · Report post On 1/30/2024 at 2:37 PM, razrab83 said: Вы сами попробуйте. мне не надо Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 71 January 30, 2024 Posted January 30, 2024 · Report post 4 hours ago, razrab83 said: До этого работал в IAR 8.5 На сайте ИАР есть руководство по переезду с 8 на 9 и там есть упоминание об использовании. float и double. У меня провайдер блокирует VPN, поэтому я не могу прочитать об этом. 42 minutes ago, razrab83 said: включены, оба сразу. предупреждений нет. В ГЦЦ есть предупреждения о таком преобразовании. Активность зависит от версии стандарта языка и, видимо, сборки компилятора. Quote Share this post Link to post Share on other sites More sharing options...
Vasily_ 119 January 30, 2024 Posted January 30, 2024 · Report post 13 минут назад, tonyk_av сказал: У меня провайдер блокирует VPN, поэтому я не могу прочитать об этом. EWARM_MigrationGuide.ENU.pdf Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 71 January 30, 2024 Posted January 30, 2024 · Report post Тут пробовали отключать? Или использовать -diag_suppress Pa205 Quote Share this post Link to post Share on other sites More sharing options...