|
|
  |
Настройка GNU toolchain from ARM для STM32, типы данных |
|
|
|
Jan 22 2014, 03:45
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(Golikov A. @ Jan 21 2014, 22:26)  напишите Код long i; printf("%i", i); и получите варнинг да, есть варнинг Цитата(Golikov A. @ Jan 21 2014, 22:26)  кстати а есть вариант в этой библиотеке Код printf("%l",i) ? скорее всего он не будет давать варнинга в таком варианте сразу два предупреждения Код warning: conversion lacks type at end of format [-Wformat=] warning: too many arguments for format [-Wformat-extra-args] повторюсь, почему я создал тему: раньше пользовался кейлом, и там Код typedef unsigned int uint32_t; и никаких возражений на счет printf("%i\n",i); у компилятора не возникало сейчас перешел на бесплатный компилятор, в котором Код typedef unsigned long uint32_t; + варнинг. это то меня и смутило. причем в кейле определение uint32_t статично, а в бесплатном компиляторе определение зависит от дифайна #if __have_long32 который в свою очередь зависит от #elif __STDINT_EXP(LONG_MAX) == 0x7fffffff && !defined(__SPU__) и тд я подумал, может компилятору ключей каких то нехватает, что бы uint32_t определился как в кейле, для этого должно выполниться условия препроцессора Код #elif __STDINT_EXP(INT_MAX) == 0x7fffffffL typedef signed int int32_t; typedef unsigned int uint32_t; Цитата(scifi @ Jan 21 2014, 23:26)  Вы будете смеяться, но warning таки от компилятора :-) спасибо кэп  на запись printf("%" PRIu32 "\n",i); Код ../Sources/main.c:45:14: error: expected ')' before 'PRIu32' printf("%" PRIu32 "\n",i); ^ ../Sources/main.c:45:14: warning: spurious trailing '%' in format [-Wformat=]
Сообщение отредактировал k000858 - Jan 22 2014, 03:28
|
|
|
|
|
Jan 22 2014, 06:44
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(k000858 @ Jan 22 2014, 05:45)  Код ../Sources/main.c:45:14: error: expected ')' before 'PRIu32' printf("%" PRIu32 "\n",i); ^ ../Sources/main.c:45:14: warning: spurious trailing '%' in format [-Wformat=] Вы читайте все ответы Эти спецификаторы определены в файле inttypes.h Код #include <inttypes.h> Если пишете на C++, то надо еще предопределить символ __STDC_FORMAT_MACROS, например через CPPFLAGS += -D__STDC_FORMAT_MACROS в makefile.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 22 2014, 07:08
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(Сергей Борщ @ Jan 22 2014, 10:44)  Вы читайте все ответы Эти спецификаторы определены в файле inttypes.h Код #include <inttypes.h> Если пишете на C++, то надо еще предопределить символ __STDC_FORMAT_MACROS, например через CPPFLAGS += -D__STDC_FORMAT_MACROS в makefile. а, точняк. забыл включить inttypes.h Код uint32_t i = 1; printf("%" PRIu32 "\n",i); в этом варианте варнинга нет
|
|
|
|
|
Jan 22 2014, 11:44
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(k000858 @ Jan 22 2014, 11:08)  а, точняк. забыл включить inttypes.h Код uint32_t i = 1; printf("%" PRIu32 "\n",i); в этом варианте варнинга нет алелуя
|
|
|
|
|
Jan 22 2014, 15:12
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(scifi @ Jan 22 2014, 19:06)  И я таки отвечал на этот вопрос выше. Отвечу снова: подрихтуйте файл stdint.h. хотелось бы подрихтовать библиотеку с помощью макроопределений (они ведь там не просто так для красоты) заодно понять как, где и зачем они выбираются
|
|
|
|
|
Feb 10 2014, 03:51
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(Mihey_K @ Jan 26 2014, 06:29)  Не вздумайте править библиотечные хидеры stdint.h, т.к. на вашей машине проект будет работать как положено, а на другой - нет. Используйте макроопределения. вот я как раз через макроопределения и хотел настроить нужные мне типы данных однако немного не понимаю, откуда берутся все эти Код #if __have_long32 #elif __STDINT_EXP(LONG_MAX) == 0x7fffffff && !defined(__SPU__) подозреваю, что от настроек компилятора
|
|
|
|
|
Mar 20 2014, 00:47
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(scifi @ Jan 21 2014, 11:57)  К примеру, в lwip эта проблема решается так: CODE /* Define generic types used in lwIP */ typedef unsigned char u8_t; typedef signed char s8_t; typedef unsigned short u16_t; typedef signed short s16_t; typedef unsigned long u32_t; typedef signed long s32_t;
typedef u32_t mem_ptr_t;
/* Define (sn)printf formatters for these lwIP types */ #define U16_F "hu" #define S16_F "hd" #define X16_F "hx" #define U32_F "lu" #define S32_F "ld" #define X32_F "lx"
То есть для переносимости сделаны конфигурируемые макросы. А если переносимость не нужна, то пишите "%lu". Вот сейчас столкнулся с аналогичными варнингами при сборке LwIP Код ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c:1223:11: warning: format '%u' expects argument of type 'unsigned int', but argument 4 has type 'long unsigned int' [-Wformat=] ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c:1223:11: warning: format '%u' expects argument of type 'unsigned int', but argument 2 has type 'u32_t' [-Wformat=] ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c:1223:11: warning: format '%u' expects argument of type 'unsigned int', but argument 4 has type 'long unsigned int' [-Wformat=] 'Finished building: ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c' сс.h Код typedef unsigned char u8_t; typedef signed char s8_t; typedef unsigned short u16_t; typedef signed short s16_t; typedef unsigned long u32_t; typedef signed long s32_t; typedef u32_t mem_ptr_t; typedef int sys_prot_t;
#define U16_F "hu" #define S16_F "d" #define X16_F "hx" #define U32_F "u" #define S32_F "d" #define X32_F "x" #define SZT_F "uz"
|
|
|
|
|
Mar 24 2014, 03:19
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Т.е. компилятор пишет варнинги при использовании unsigned long в качестве unsigned int, хотя в ARM типы одинаковы. компилятор https://launchpad.net/gcc-arm-embeddedпредупреждения перестают писаться при отключении -Wall, но тогда вообще никаких предупреждений нет. подрихтовывать stdint.h не вариант...
|
|
|
|
|
Mar 24 2014, 04:41
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(scifi @ Mar 24 2014, 07:35)  У вас ошибка в файле cc.h: раз уж u32_t - это unsigned long, то и формат для printf должен быть "%lu". И вообще, почитайте про printf. файл сс.h взят от ST (пример проекта для Keil, IAR, TrueStudio и тд) этот же проект в кейле компилируется без каких либо варнингов но там и uint32_t unsigned int только в бесплатной версии eclipse + GNU Tools for ARM Embedded Processors такая непонятка с типами... ну понятно, что можно в cc.h подправить #define U32_F "u" на #define U32_F "lu"...но может есть способ принудительно компилятору определить uint32_t как в большенстве компиляторов? определяется тип макросом #if __STDINT_EXP(LONG_MAX) > 0x7fffffff а откуда что берется не понятно. так же наверняка можно компилятор с помощью некой опции попросить не беспокоиться о несоответствии unsigned int и unsigned long (ведь тот же кейл не дергается..)
|
|
|
|
|
Mar 24 2014, 05:28
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(k000858 @ Mar 24 2014, 08:41)  файл сс.h взят от ST (пример проекта для Keil, IAR, TrueStudio и тд) Ну вот и найдена причина: ST славен своим индусским говнокодом. Цитата(k000858 @ Mar 24 2014, 08:41)  ...но может есть способ принудительно компилятору определить uint32_t как в большенстве компиляторов? Сомневаюсь, что есть такой способ. А даже если бы и был, это было бы скорее вредно, чем полезно. Потому что эти предупреждения реально указывают на ошибки в коде (да, безобидные ошибки, но это до поры до времени). Не надо принудительно давить предупреждения, надо исправлять сами ошибки. Цитата(k000858 @ Mar 24 2014, 08:41)  так же наверняка можно компилятор с помощью некой опции попросить не беспокоиться о несоответствии unsigned int и unsigned long (ведь тот же кейл не дергается..) Это скорее недоработка кейла. Но иметь возможность отключать конкретное предупреждение было бы удобно и оправдано в ряде случаев, это да.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|