|
Flat в printf()! Как? |
|
|
|
Nov 24 2008, 10:15
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303

|
Всем доброе время суток! Я переношу свой проект с СVAVR на GCC, в GCC возникла проблема с выводом значений с плавающей зяпятой: float k=1.23; printf ("d = %f",k); при выводе получаю: d = ? Тот же код работает в СVAVR, и не работает в ICC, только вместо знака вопроса выводит d = error Помогите, плиз...
--------------------
Роботы делают роботов - предел автоматизации
|
|
|
|
|
Nov 24 2008, 10:46
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303

|
Цитата(SysRq @ Nov 24 2008, 13:36)  Use -lprintf_flt, Luke  Правьте makefile, подключите floating point библиотеку. Спасибо, пробую!
--------------------
Роботы делают роботов - предел автоматизации
|
|
|
|
|
Nov 24 2008, 10:46
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Код PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt PRINTF_LIB = $(PRINTF_LIB_FLOAT) У меня попутный вопрос. А вот и он  Код char *float_to_ASCII(float n, unsigned char dp) { snprintf_P(ascii_str_buffer, 32, PSTR("%#.*f"), dp, n); //ICCAVR ok - в GCC не работает. return (ascii_str_buffer); }
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 24 2008, 11:37
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303

|
а use -lprintf_flt куда конкретно писать в мэйк файл? Библиотеку <float.h> подключил.
--------------------
Роботы делают роботов - предел автоматизации
|
|
|
|
|
Nov 24 2008, 11:46
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Шалапут:-) @ Nov 24 2008, 14:37)  а use -lprintf_flt куда конкретно писать в мэйк файл? Библиотеку <float.h> подключил. Я же привёл кусок из Makefile - найди похожие строки и просто раскомментируй их (м.б. придётся что-то закомментировать)... Повторяю ещё раз: PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt PRINTF_LIB = $(PRINTF_LIB_FLOAT)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 24 2008, 11:52
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(Шалапут:-) @ Nov 24 2008, 13:37)  а use -lprintf_flt куда конкретно писать в мэйк файл? Библиотеку <float.h> подключил. На этапе линковки компиляции добавлять (либо в $LDFLAGS в makefile-е, и не забыть добавить в коммандную строку). Пример ручного вызова: Код gcc some.c -o some.elf -lprintf_flt Пример makefile-а Код CFLAGS= -Os LDFLAGS= -lprintf_flt OBJS= $(patsubst %.c,%.o,$(wildcard *.c)) .PHONY all .c.o: gcc -c $< $(CFLAGS) target: $(OBJS) gcc $^ -o $@ $(LDFLAGS) all: target
|
|
|
|
|
Nov 24 2008, 12:11
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303

|
Цитата(demiurg_spb @ Nov 24 2008, 14:46)  Я же привёл кусок из Makefile - найди похожие строки и просто раскомментируй их (м.б. придётся что-то закомментировать)... Повторяю ещё раз: PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt PRINTF_LIB = $(PRINTF_LIB_FLOAT) Я не нашёл даже похожих строк в мэйк файле. Пробовал вставлять в разные места мэйк файла, затем компилировать, но после компиляции внесённые мной изминения удалялись. Также АВР студия выдаёт ворнинг о несовместимости типов: ../joreg.c:73: warning: format '%f' expects type 'double', but argument 2 has type 'float' Ниже привожу свой мэйкфайл..
Сообщение отредактировал Шалапут:-) - Nov 24 2008, 12:13
--------------------
Роботы делают роботов - предел автоматизации
|
|
|
|
|
Nov 24 2008, 12:48
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(demiurg_spb @ Nov 24 2008, 13:46)  Код snprintf_P(ascii_str_buffer, 32, PSTR("%#.*f"), dp, n); //ICCAVR ok - в GCC не работает. Цитата The variable width or precision field (an asterisk * symbol) is not realized and will to abort the output.
|
|
|
|
|
Nov 24 2008, 12:57
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303

|
Цитата(demiurg_spb @ Nov 24 2008, 15:33)  Минималистичненько  Возьмите за основу WinAVR\sample\Makefile Взял за основу, сейчас редактирую.. посмотрим, что выйдет
--------------------
Роботы делают роботов - предел автоматизации
|
|
|
|
|
Nov 25 2008, 21:46
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303

|
Цитата(demiurg_spb @ Nov 24 2008, 14:33)  Минималистичненько  Возьмите за основу WinAVR\sample\Makefile Отредактировал Этот мэйкфайл, там действительно были закоментированы строки с "FLOAT", Сделал так: # Floating point printf version (requires MATH_LIB = -lm below) PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt # If this is left blank, then it will use the Standard printf version. #PRINTF_LIB = #PRINTF_LIB = $(PRINTF_LIB_MIN) PRINTF_LIB = $(PRINTF_LIB_FLOAT) MATH_LIB = -lm Привязал внешний отредактированный мэйкфайл из студии, но эффект тот же. Вместо значений выводится знак вопроса... Вот пример: Код #include <stdio.h> #include <float.h> #include <math.h> //... float d =159.21; printf ("%f\n",d); printf("I am a Atmega16 MCU"); Результат: ? I am a Atmega16 MCU странно... почему так? Может кто то поделится свим мэйкфайлом попроще, с возможностью вывода float?.. А то я какой то необразованный... читал в книге Ю.А.Шпак, там используют GCC, так нет примеров с выводом float, как специально.. Ниже добавил отредактированный мэйкфайл, всё ещё неработающий..
--------------------
Роботы делают роботов - предел автоматизации
|
|
|
|
|
Nov 25 2008, 22:21
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(Шалапут:-) @ Nov 26 2008, 00:46)  Ниже добавил отредактированный мэйкфайл, всё ещё неработающий.. Cохранил его, добивил файл с кодом: CODE #include <avr\io.h>
#include <stdio.h> #include <float.h> #include <math.h>
static char str[20];
int main(void) { float d = 159.21; sprintf(str, "%f\n", d); for(;;) { static int i; str[i++] = 0; } } Из командной строки сказал make all, засунул .elf в AVRStudio и str добавил в watch. Работает, d отsprintf'илось в str.
Сообщение отредактировал SysRq - Nov 25 2008, 22:21
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|