|
Переменные long long |
|
|
|
Sep 3 2015, 15:53
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (inventor @ Sep 3 2015, 16:55)  ставил и normal и full - ничего не помогает 1) Какая версия IAR? 2) У IAR несколько библиотек так-что нужно выбрать нужную Вашем случае Full, но кроме этого есть еще отдельные настройки полноты формата printf() - там тоже чего-нибудь типа Full 3) "пишется какая то лажа - printf ничего не выводит" - лажа и ничего, все-же разные вещи. 4) Есть докуменация на конкретный тип контрорллера+компилятора - там есть информация, что поддерживавется, что нет и в каких вариантах библиотек.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 4 2015, 07:28
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(zltigo @ Sep 3 2015, 18:53)  1) Какая версия IAR? 2) У IAR несколько библиотек так-что нужно выбрать нужную Вашем случае Full, но кроме этого есть еще отдельные настройки полноты формата printf() - там тоже чего-нибудь типа Full 3) "пишется какая то лажа - printf ничего не выводит" - лажа и ничего, все-же разные вещи. 4) Есть докуменация на конкретный тип контрорллера+компилятора - там есть информация, что поддерживавется, что нет и в каких вариантах библиотек. с библиотеками возица не стал - просто разбил длинное число на 2 u32 и вывожу в 16-тиричном виде. компилятор работает - заполняет переменные правильно.
|
|
|
|
|
Sep 6 2015, 03:33
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(inventor @ Sep 3 2015, 15:50)  пишется какая то лажа - printf ничего не выводит, хотя пытаюсь и %lld и %Ld компилятор C99 и вроде должен поддерживать все эти вещи Он и поддерживает. Должно быть так: Код long long ll = 100500; printf( "ll = %" PRIu64 "\n\r", ll ); Остальное по аналогии можно найти самостоятельно. См. например тут или тут. И лучше отойти от всех этих неопределенных short, long и т.п. В Це99 существуют более внятные типы, вроде uint32_t, uint64_t, int64_t...
|
|
|
|
|
Sep 6 2015, 17:37
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(zltigo @ Sep 6 2015, 10:04)  Находясь в твердом уме "так" писать не надо. Почему у Автора не получилсь - уже объяснили. По этой причине и использование макросов-оберток вместо явного описания формата ничего не изменит. Прежде чем лезть умничать, неплохо бы проверить/почитать. В IAR, даже с "правильной" библиотекой, действительно могут не работать %lld и %Ld, при этом PRIu64 работает без проблем. За давностью времени, сейчас уже не помню, на каком из IAR с этим сталкивался, возможно ARM, возможно AVR. Но это факт. Что у автора получилось - я видел. Костыль, да еще и кривой. Мой вариант - рабочий. Причем в отличии от ворчания отдельных граждан, проверено непосредственно в IAR. Почему "так" писать надо, следует из ссылки, что я дал. Код #include <inttypes.h> #include <stdio.h>
int main( void ) { long long ll = 0; uint64_t u64 = 0;
while( true ) { printf( "ll = %" PRIu64 "\n", ll ); printf( "u64 = %" PRIu64 "\n", u64 );
u64 = u64 ? u64 << 1 : 1; ll = ll ? ll << 1 : 1; } } Терминал: Код u64 = 144115188075855872 ll = 288230376151711744 u64 = 288230376151711744 ll = 576460752303423488 u64 = 576460752303423488 ll = 1152921504606846976 u64 = 1152921504606846976 ll = 2305843009213693952 u64 = 2305843009213693952 ll = 4611686018427387904 u64 = 4611686018427387904 ll = 9223372036854775808 u64 = 9223372036854775808 ll = 0 u64 = 0 ll = 1 u64 = 1 ll = 2 u64 = 2 ll = 4 u64 = 4 ll = 8 u64 = 8 ll = 16 u64 = 16 ll = 32 u64 = 32 ll = 64 u64 = 64 ll = 128 u64 = 128 ll = 256 u64 = 256 ll = 512 u64 = 512 ll = 1024 u64 = 1024 ll = 2048 u64 = 2048 ll = 4096 u64 = 4096
|
|
|
|
|
Sep 6 2015, 18:54
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Tahoe @ Sep 6 2015, 20:37)  Прежде чем лезть умничать, неплохо бы проверить/почитать. В IAR, даже с "правильной" библиотекой, действительно могут не работать %lld и %Ld, при этом PRIu64 работает без проблем. А то, что муть " PRIu64 " есть ни что иное, как макрос-обертка llu это никакой мыслью в Вас в голове не отозвалось? CODE #define __STRINGIFY(a) #a #define __PRI64(x) __STRINGIFY(l##x) #define PRIu64 __PRI64(u) Так что "проверяй" не проверяй. QUOTE Но это факт. Увы, но это бред  . QUOTE Мой вариант - рабочий. Причем в отличии от ворчания отдельных граждан, проверено непосредственно в IAR. Не сочтите за труд выкинуть муть " PRIu64 " и написать llu и получите точно такой-же рабочий вариант.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 6 2015, 19:09
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(zltigo @ Sep 6 2015, 21:54)  Не сочтите за труд выкинуть муть " PRIu64 " и написать llu и получите точно такой-же рабочий вариант. Вот на данной, конкретной версии EWARM? Вполне допускаю, что так оно и будет. Но это будет вариант "здесь играем, здесь не играем, здесь рыбу заворачивали"(с), в EWARM работает, в каком-нить EWAVR нет... Меня такой вариант не устраивает. Не хватало еще париться со всякой ерундой. Стандартная библиотека C99 предписывает использовать PRIxxx/SCNxxx? Значит их и буду использовать. Да, мне тоже не нравится и не привычно. Но меня никто не спрашивал.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|