Где sprintf в CooCox ?

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Где sprintf в CooCox ?

Сообщение mr_smit »

Добрый день. Как работать со sprintf в CooCox ??? В чистом виде не компилируется. Показывает не понятные ошибки привязанные к ядру. Погуглил, нашел: http://www.coocox.org/show_comp.php?id= ... 1d7d723e56
Кокосовцы в курсе и предлагают прикрепить к проекту доп. файлик. Прикрепил. Всё стало компилироваться. Но sprintf не работает. Может кто прояснит ситуацию.

Код: Выделить всё

char convert[32];
float temp = 23.9;
...
put_string(50,22,"ТЕМПЕРАТУРА",0x0000,2);
    	
sprintf(convert,"%.1f",temp);
put_string(50,50,convert,0x0000,2);
Слово "температура" выводится, а само значение нет.
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: Где sprintf в CooCox ?

Сообщение Satyr »

не знаю как в кукоксе, а во взрослых компиляторах, для экономии размера кода, есть несколько версий функций *prinf/*scanf с разным набором поддерживаемых форматов данных и инструкций форматирования.
В том же IARe, флоаты печатаются только в самой полной версии функций.
Реклама
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Где sprintf в CooCox ?

Сообщение mr_smit »

Satyr писал(а):не знаю как в кукоксе, а во взрослых компиляторах, для экономии размера кода, есть несколько версий функций *prinf/*scanf с разным набором поддерживаемых форматов данных и инструкций форматирования
Во во. Кокосовцы как раз про это и пишут, но я что то не пойму почему не работает.

Посмотрел их измененный файл. У них там написано:

Код: Выделить всё

signed int sprintf(char *pStr, const char *pFormat, ...)
Что значит троеточие???

И где форматирование точка с запятой 'f' ?

Код: Выделить всё

/* Parse type */
            switch (*pFormat) {
            case 'd': 
            case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
            case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
            case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
            case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
            case 's': num = PutString(pStr, va_arg(ap, char *)); break;
            case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
            default:
                return EOF;
            }
Как тогда число с плавающей точкой перевести в строку то? :(
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Где sprintf в CooCox ?

Сообщение mr_smit »

Вопрос остается открытым. Как float отобразить??? :shock: Думал modf использовать, но эта функция всё равно дробную часть в виде точки с запятой выдает. Умножение на 10 не помогает.
Нельзя всё знать, достаточно понимать.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Где sprintf в CooCox ?

Сообщение mr_smit »

Что то не хватает у меня мозгов додуматься. Задал вопрос на форуме тех поддержки CooCox - тоже тишина.
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
barby67
Потрогал лапой паяльник
Сообщения: 365
Зарегистрирован: Вт янв 22, 2008 23:13:41
Откуда: Калининград

Re: Где sprintf в CooCox ?

Сообщение barby67 »

mr_smit, я так понимаю вы хотите 32-ух разрядное с FPU в sprintf запихнуть? У меня не получилось даже с u32 это сделать, пришлось выводить два u16.
Реклама
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Где sprintf в CooCox ?

Сообщение mr_smit »

Я просто наверное чего то не понимаю. По простому в строку температуру не перевести что ли???? :shock:
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Где sprintf в CooCox ?

Сообщение mr_smit »

В общем ответа на вопрос я так и не получил :( Жаль
Нельзя всё знать, достаточно понимать.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: Где sprintf в CooCox ?

Сообщение Satyr »

кококом пользуются преимущественно новички, что не в курсе.
а кто тонкости знает - те знают как эти тонкости устроены НЕ в кококсе :)))
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Где sprintf в CooCox ?

Сообщение mr_smit »

В ARM я новичок. CooCox показался удобным и понятным
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Где sprintf в CooCox ?

Сообщение mr_smit »

В общем я всё равно не понимаю... :(

Мне приходит по UARTу число в hex виде. Мне его надо пересчитать по определенной формуле и результат отобразить. Например:

Код: Выделить всё

char convert[32];
unsigned char xxx = 0xA2;

// формула N = 5.2 + E/20 ; где Е - передаваемое значение

sprintf(convert,"%.1f",(5.2 + (float) xxx/20));     // напряжение 
put_string(16,77,convert,text_parametr,2);
Отображает 13,3 (A2 hex -> 162 dec -> 5.2+162/20=13.3)

Во втором случае мне приходит 2 байта которые вместе являются 2-х байтным числом

Код: Выделить всё

char convert[32];
unsigned char xxx1 = 0x81;  // младший байт
unsigned char xxx2 = 0x02;  // старший байт

// формула N =  E/125 ; где Е - передаваемое значение

sprintf(convert,"%.1f",(float) ((xxx2 << 8) + xxx1)/125 );     // длительность впрыска
put_string(114,77,convert,text_parametr,2);
( 0281 hex -> 641 dec -> 641/125=5.1 )

В кодевижене для AVR всё это работает. В кокосе же эти самые строчки не работают. Как исправить я не представляю :(

И чего этой скотине надо :(
Спойлер[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':
[cc] writer.c:(.text+0x10): undefined reference to `_write'
[cc] sbrkr.c:(.text+0xc): undefined reference to `_sbrk'
[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-writer.o): In function `_write_r':
[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-closer.o): In function `_close_r':
[cc] closer.c:(.text+0xc): undefined reference to `_close'
[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-lseekr.o): In function `_lseek_r':
[cc] lseekr.c:(.text+0x10): undefined reference to `_lseek'
[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-readr.o): In function `_read_r':
[cc] readr.c:(.text+0x10): undefined reference to `_read'
[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\libgcc.a(unwind-arm.o): In function `get_eit_entry':
[cc] unwind-arm.c:(.text+0x144): undefined reference to `__exidx_start'
[cc] unwind-arm.c:(.text+0x148): undefined reference to `__exidx_end'
[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-abort.o): In function `abort':
[cc] abort.c:(.text+0xa): undefined reference to `_exit'
[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_kill_r':
[cc] signalr.c:(.text+0xe): undefined reference to `_kill'
[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_getpid_r':
[cc] signalr.c:(.text+0x28): undefined reference to `_getpid'
[cc] collect2: ld returned 1 exit status

BUILD FAILED
Total time: 1 second
Нельзя всё знать, достаточно понимать.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Где sprintf в CooCox ?

Сообщение uk8amk »

mr_smit, если использование именно sprintf не столь принципиально и его в кокосе завести не получается, то можно написать свою функцию для перемалывания float в строку.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Где sprintf в CooCox ?

Сообщение mr_smit »

uk8amk писал(а):mr_smit, если использование именно sprintf не столь принципиально и его в кокосе завести не получается, то можно написать свою функцию для перемалывания float в строку.
Да конечно не принципиально. Просто не понятно в чем проблема. Умножать на 10/100/1000 и выводить целочисленные через запятую как то не очень красиво
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Где sprintf в CooCox ?

Сообщение mr_smit »

Ответ с кокосового форума:

Код: Выделить всё

 do the following:
 

float float1;

snprintf(buf, sizeof(buf), "blablabla %d.%d", (int8_t) float1, (((int16_t)(float1 * 10.0)) % 10));
Нельзя всё знать, достаточно понимать.
Ответить

Вернуться в «Разные вопросы по МК»