реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Flat в printf()! Как?
Шалапут:-)
сообщение Nov 24 2008, 10:15
Сообщение #1


Участник
*

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



Всем доброе время суток! Я переношу свой проект с СVAVR на GCC, в GCC возникла проблема с выводом значений с плавающей зяпятой:

float k=1.23;
printf ("d = %f",k);

при выводе получаю: d = ?
Тот же код работает в СVAVR, и не работает в ICC, только вместо знака вопроса выводит d = error
Помогите, плиз... smile3046.gif


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
SysRq
сообщение Nov 24 2008, 10:36
Сообщение #2


Чайник, 1 литр
****

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



Use -lprintf_flt, Luke smile.gif

Правьте makefile, подключите floating point библиотеку.
Go to the top of the page
 
+Quote Post
Шалапут:-)
сообщение Nov 24 2008, 10:46
Сообщение #3


Участник
*

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



Цитата(SysRq @ Nov 24 2008, 13:36) *
Use -lprintf_flt, Luke smile.gif

Правьте makefile, подключите floating point библиотеку.


Спасибо, пробую!


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 24 2008, 10:46
Сообщение #4


неотягощённый злом
******

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



Код
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB = $(PRINTF_LIB_FLOAT)

У меня попутный вопрос. А вот и онsmile.gif
Код
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);                
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Шалапут:-)
сообщение Nov 24 2008, 11:37
Сообщение #5


Участник
*

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



а use -lprintf_flt куда конкретно писать в мэйк файл? Библиотеку <float.h> подключил.


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 24 2008, 11:46
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 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)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
msalov
сообщение Nov 24 2008, 11:52
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Шалапут:-)
сообщение Nov 24 2008, 12:11
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  ______Makefile.txt ( 1.94 килобайт ) Кол-во скачиваний: 47
 


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
SysRq
сообщение Nov 24 2008, 12:31
Сообщение #9


Чайник, 1 литр
****

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



Project\Configuration options, там слева Custom Options. Все необходимые ключи добавляются там, ежели вы используете makefile от AVRStudio.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 24 2008, 12:33
Сообщение #10


неотягощённый злом
******

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



Цитата(Шалапут:-) @ Nov 24 2008, 15:11) *
Ниже привожу свой мэйкфайл..
Минималистичненькоsmile.gif
Возьмите за основу WinAVR\sample\Makefile


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Nov 24 2008, 12:48
Сообщение #11


Чайник, 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.
Go to the top of the page
 
+Quote Post
Шалапут:-)
сообщение Nov 24 2008, 12:57
Сообщение #12


Участник
*

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



Цитата(demiurg_spb @ Nov 24 2008, 15:33) *
Минималистичненькоsmile.gif
Возьмите за основу WinAVR\sample\Makefile

Взял за основу, сейчас редактирую.. посмотрим, что выйдет


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 24 2008, 13:17
Сообщение #13


неотягощённый злом
******

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



Цитата
The variable width or precision field (an asterisk * symbol) is not realized and will to abort the output.
Обидно, досадно, ну да ладно...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Шалапут:-)
сообщение Nov 25 2008, 21:46
Сообщение #14


Участник
*

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



Цитата(demiurg_spb @ Nov 24 2008, 14:33) *
Минималистичненькоsmile.gif
Возьмите за основу 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, как специально..

Ниже добавил отредактированный мэйкфайл, всё ещё неработающий..
Прикрепленные файлы
Прикрепленный файл  ______Make.txt ( 17.11 килобайт ) Кол-во скачиваний: 52
 


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
SysRq
сообщение Nov 25 2008, 22:21
Сообщение #15


Чайник, 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
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016