razrab83 21 30 января Опубликовано 30 января · Жалоба //*.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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 30 января Опубликовано 30 января · Жалоба 1. Заимейте привычку указывать после float-констант букву f 🙂 2. Сослаться на конкретные пруфы не могу, но вроде бы printf все равно внутри себя повышает все float в double, так что с double все равно придется иметь дело. Так что, наверное, самый простой способ - явно привести аргумент к double: sprintf(str, "%f", (double)pi); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 21 30 января Опубликовано 30 января · Жалоба Первая ссылка из гугла Or you could just do something like: printf("%d.%.6d", (int)x, (int)((x-(int)x)*1000000)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 30 января Опубликовано 30 января · Жалоба 10 минут назад, AndyBig сказал: Заимейте привычку указывать после float-констант букву f а кто сказал что у меня нет такой привычки? написал для ПРИМЕРА. Изначально был такой пример float pi; sprintf(str, "%f", pi); Но подумал: щя найдется учитель, который будет учить инициализировать переменные перед использованием. Или спросит "а что такое str?". Немного доработал пример... но всё равно "занавеска" кому-то не угодила )). можно ещё и про snprintf(str, 100, ...) вспомнить для str[100]. По делу, вопрос остался: почему в IAR 8,5 нет предупреждения, а в 9.4 есть в одном проекте есть предупреждение, в другом нет? Почему в iccarm есть предупреждение, а в gcc нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 30 января Опубликовано 30 января · Жалоба 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, поэтому предупреждения в моём проекте недопустимы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 40 30 января Опубликовано 30 января (изменено) · Жалоба 2 hours ago, razrab83 said: ни каких предупреждений Настройки компилятора смотрели? Их там много. Скорей всего, по умолчанию этот варнинг теперь разрешен. Если не указан суффикс "f" после числа с плавающей точкой, то компилятор использует его как double. Посмотрите на код в этой строчке: float pi = 3.14; Там будет приведение дабла к флоат с последующим присвоением. Поэтому при разрешённом варнинге на приведения типов компилятор справедливо ругается на эту строку: sprintf(str, "%f", pi); Изменено 30 января пользователем tonyk_av Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 30 января Опубликовано 30 января · Жалоба 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) тоже нет ворнинга. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 30 января Опубликовано 30 января · Жалоба 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. Или оба сразу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 30 января Опубликовано 30 января · Жалоба 7 минут назад, dimka76 сказал: А вы в GCC включите все предупреждения, что-то вроде -Wall. Еще можно употребить ключик -pedantic. Или оба сразу. включены, оба сразу. предупреждений нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 30 января Опубликовано 30 января · Жалоба On 1/30/2024 at 2:11 PM, razrab83 said: включены, оба сразу. предупреждений нет. попробуйте -Wformat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 30 января Опубликовано 30 января · Жалоба 6 минут назад, dimka76 сказал: -Wformat с -Wformat предупреждения в gcc нет. 7 минут назад, dimka76 сказал: попробуйте Вы сами попробуйте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 30 января Опубликовано 30 января · Жалоба On 1/30/2024 at 2:37 PM, razrab83 said: Вы сами попробуйте. мне не надо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 40 30 января Опубликовано 30 января · Жалоба 4 hours ago, razrab83 said: До этого работал в IAR 8.5 На сайте ИАР есть руководство по переезду с 8 на 9 и там есть упоминание об использовании. float и double. У меня провайдер блокирует VPN, поэтому я не могу прочитать об этом. 42 minutes ago, razrab83 said: включены, оба сразу. предупреждений нет. В ГЦЦ есть предупреждения о таком преобразовании. Активность зависит от версии стандарта языка и, видимо, сборки компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vasily_ 53 30 января Опубликовано 30 января · Жалоба 13 минут назад, tonyk_av сказал: У меня провайдер блокирует VPN, поэтому я не могу прочитать об этом. EWARM_MigrationGuide.ENU.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 40 30 января Опубликовано 30 января · Жалоба Тут пробовали отключать? Или использовать -diag_suppress Pa205 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться