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

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

|
Какие опции задать компилятору, что бы тип uint32_t соответствовал типу unsigned int, а не unsigned long ? В данный момент тип uint32_t приводит по ссылке в Код #if __have_long32 typedef signed long int32_t; typedef unsigned long uint32_t; #define __int32_t_defined 1
|
|
|
|
|
Jan 21 2014, 07:50
|

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

|
Цитата(scifi @ Jan 21 2014, 11:44)  Зачем? unsigned int и unsigned long - это одинаковые типы на ARM, просто название разное. К тому же вы можете просто руками поправить хедер stdint.h (или что он там ещё включает). Но зачем? код вида Код uint32_t i; printf("%i\n",i); приводит к варнингам Код warning: format '%i' expects argument of type 'int', but argument 2 has type 'uint32_t' [-Wformat=]
|
|
|
|
|
Jan 21 2014, 09:21
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37

|
k000858, Вы предполагаете, что если Вы напишете Код unsigned int i; printf("%i\n",i); варнинга не будет? Варнинг генерится из-за того, что формат %i - это вывод знакового целого, а Вы подсовываете ему unsigned ... Попробуйте Код unsigned int i; printf("%u\n",i);
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Jan 21 2014, 09:42
|

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

|
Цитата(k000858 @ Jan 21 2014, 09:50)  Код warning: format '%i' expects argument of type 'int', but argument 2 has type 'uint32_t' [-Wformat=] Угу. Чтобы избежать подобных казусов специально для типов из stdint.h в файле inttypes.h объявлены и спецификаторы форматаКод uint32_t i; printf("%" PRIu32 "\n",i); Да, несколько уродует форматную строку, но 100% переносимо.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 21 2014, 09:42
|

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

|
Цитата(VAI @ Jan 21 2014, 13:21)  k000858, Вы предполагаете, что если Вы напишете Код unsigned int i; printf("%i\n",i); варнинга не будет? Варнинг генерится из-за того, что формат %i - это вывод знакового целого, а Вы подсовываете ему unsigned ... Попробуйте Код unsigned int i; printf("%u\n",i); я бы не стал спрашивать (тем более создавать тему на форуме) если б не проверил варнинга действительно нет самое интересное, что в других компиляторах с таким не сталкивался. к примеру в кейле typedef unsigned int uint32_t; соответственно и варнингов не возникает
|
|
|
|
|
Jan 21 2014, 12:29
|

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

|
и все таки я не понимаю, почему нет варнинга на Код unsigned int i; printf("%i\n",i); но есть на Код uint32_t i; printf("%i\n",i); если unsigned int = uint32_t
|
|
|
|
|
Jan 21 2014, 16:49
|

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

|
Цитата(Golikov A. @ Jan 21 2014, 20:12)  а есть варнинг на Код uint32_t i; printf("%i\n",(unsigned int)i); ? кстати всегда можно прагмой конкретный варнинг задавить  С приведением типа варнинга нет Давить варнинги не вариант, хотелось бы разобраться в чем причина
|
|
|
|
|
Jan 21 2014, 17:53
|

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

|
вопрос остается открытым, не важно откуда я его задал Цитата(k000858 @ Jan 21 2014, 16:29)  почему нет варнинга на Код unsigned int i; printf("%i\n",i); но есть на Код uint32_t i; printf("%i\n",i); если unsigned int = uint32_t
|
|
|
|
|
Jan 21 2014, 18:26
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
варнинг от функции printf, она пытается данный ей лонг конвертнуть в int, она же библиотечная и старинная, так получилось что в арме int == long, а в avr int == 16, потому int32 для avr - это лонг, да и вообще int это 16 бит, а 32 бита это long. напишите Код long i; printf("%i", i); и получите варнинг кстати а есть вариант в этой библиотеке Код printf("%l",i) ? скорее всего он не будет давать варнинга а вообще когда народ устал от путаницы с тем сколько бит int long и прочее, и появились int32_t типы, и коль вы встали на этот путь, то вам надо использовать тот же однозначно определенный вариант печати Код printf("%" PRIu32 "\n",i);
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|