|
Вывод с помощью fprintf в WinAVR, Помогите с форматированным выводом |
|
|
|
Jul 1 2011, 19:52
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
В стандартном С это делаетcя так (ширина поля и точность могут задаваться аргументом, тогда в формате * вместо числа): Код #include <stdio.h> void pr(int digits, float value) { printf("%6.*f\n", digits, value); }
int main() { pr(4, 1.2345f); pr(3, 12.345f); pr(2, 123.45f); } Из-под avr-gcc сейчас некуда залить для на терминлку выдать, но должно работать в максимальном форматтере (а с float всё равно только максимальный и нужен). Так что можно нагородить что-то в духе Код printf("F = %6.*f Hz\n", value < 10 ? 4 : value < 100 ? 3 : 2, value);
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 3 2011, 17:06
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(smk @ Jul 3 2011, 15:32)  Не получается. Нужно как-то иначе. Или прийдется писать свою процедуру вывода. Точно, не получается :-( Таки не всё поддерживает, а жаль. Ну тогда так Код fprintf_P(fconsole , value < 10 ? PSTR("F = %6.4f Hz\n") : value < 100 ? PSTR("F = %6.3f Hz\n") : PSTR("F = %6.2f Hz\n") , value); Так как миленькое работает, просто гробовато выглядит.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 3 2011, 18:46
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 1-02-11
Из: Днепропетровск
Пользователь №: 62 622

|
Цитата(smk @ Jul 1 2011, 19:20)  Мне нужно выводить строчку в виде "F = 0.0000 Hz". При этом число дожно иметь три вида в зависимости от значения частоты: 1) 0.0000; 2) 00.000; 3) 000.00 . Как правильно это сделать используя библиотечные функции форматированного вывода? Спасибо. не уверен за WinAVR - но по крайней мере в стандарте С можно извернуться так 1. использовать sprintf - пишем в память 2. из памяти выводим любым удобным способом - даже посимвольно, как из массива.
|
|
|
|
|
Jul 4 2011, 05:23
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(skripach @ Jul 3 2011, 17:08)  printf("F = %06f Hz\n", value); Не? Не. Цитата(Dnepr33 @ Jul 3 2011, 21:46)  не уверен за WinAVR - но по крайней мере в стандарте С можно извернуться так 1. использовать sprintf - пишем в память 2. из памяти выводим любым удобным способом - даже посимвольно, как из массива. Ну где-то так оно и делается. fprintf не догма. можно и другую функцию, лишь бы выводить удобно было. Цитата(sergeeff @ Jul 3 2011, 21:37)  А в printf включена поддержка float? А как узнать? Как я понял там аргумент double. Цитата(ReAl @ Jul 3 2011, 20:06)  Точно, не получается :-( Таки не всё поддерживает, а жаль. Ну тогда так Код fprintf_P(fconsole , value < 10 ? PSTR("F = %6.4f Hz\n") : value < 100 ? PSTR("F = %6.3f Hz\n") : PSTR("F = %6.2f Hz\n") , value); Так как миленькое работает, просто гробовато выглядит. Значение не отображает. Знак вопроса выводит. Текст выводит правильно. Вот собственно тестовый код, куда и надо вставить строчку с выводом: Код #define F_CPU 8000000UL // 16.0 MHz #include <util/delay.h> #include "defines.h" #include <ctype.h> #include <stdint.h> #include <stdio.h> #include <avr/pgmspace.h> #include "lcd.h"
volatile unsigned char q; volatile unsigned int f=0xF; volatile double frq; double fp = 1; FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);
ISR(TIMER0_OVF_vect) { ++q; if(q==1) { PORTA ^= (1<<7); q=0; } }
int main(void) { DDRA = 0b10000000; PORTB = 0b00000000; DDRB = 0b10111111; TCCR0A = 0b10000000; TCCR0B = 0b00000110; TIMSK = 0b00000010;
frq=123;
lcd_init(); stderr = &lcd_str;
fprintf_P(stderr, PSTR("F = %6.4f Hz\n"), frq);
/*value < 10 ? PSTR("F = %6.4f Hz\n") : value < 100 ? PSTR("F = %6.3f Hz\n") : PSTR("F = %6.2f Hz\n")*/
asm("sei");
while(1) { asm("nop"); }
return 0; }
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 4 2011, 06:20
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(smk @ Jul 4 2011, 08:23)  Значение не отображает. Знак вопроса выводит. Текст выводит правильно. не включена поддержка float в fprintf. добавьте следующие параметры компилятору: -Wl,-u,vfprintf -lprintf_flt -lm
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jul 4 2011, 09:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(smk @ Jul 4 2011, 13:00)  не работает. потому и подумал, что неправильно что-то сделал. Ну напишите в main для проверки: Код float pi = 3.14f; printf("pi = %.02f\n", pi); Должно печатать: Код pi = 3.14
|
|
|
|
|
Jul 4 2011, 09:49
|

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

|
Цитата(ReAl @ Jul 3 2011, 21:06)  Точно, не получается :-( Таки не всё поддерживает, а жаль. Тоже давненько наткнулся на отсутствие обработки символа звёздочка в форматере printf'a в gcc. А топикстартеру рекомендую обратить внимание на функцию Код dtostrf(f, WIDTH, PREC, buff) таким образом можно выиграть по памяти не включая в проект толстую printf с поддержкой float.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 4 2011, 12:01
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(sergeeff @ Jul 4 2011, 12:03)  Ну напишите в main для проверки: Код float pi = 3.14f; printf("pi = %.02f\n", pi); Должно печатать: Код pi = 3.14 Вот такая ошибка: Код ../exampl.c:44: warning: format '%.02f' expects type 'double', but argument 2 has type 'float' В моем случае может следует вот так: Код printf(stderr, "pi = %.02f\n", pi); Цитата(demiurg_spb @ Jul 4 2011, 12:49)  Тоже давненько наткнулся на отсутствие обработки символа звёздочка в форматере pfintf'a в gcc. А топикстартеру рекомендую обратить внимание на функцию Код dtostrf(f, WIDTH, PREC, buff) таким образом можно выиграть по памяти не включая в проект толстую printf с поддержкой float. Обратил. Теперь пытаюсь понять как пользоваться.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|