Отговори на тема  [ 11 мнения ] 
sprintf в С за AVR 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 16, 2006 5:20 pm
Мнения: 122
Местоположение: гр. Горна Оряховица
Мнение sprintf в С за AVR
Колеги ,пак съм аз какво ли не съм правил с контролери,но явно тези математики ми объркаха понятията за С.
Ползвам CodeVisionAVR и ATMega8.Искам да изведа резултат на седемсегментна индикация.Казахте ми да ползвам
sprintf ,но доколкото разбирам тази функция връща стринг от ASCII кодове.Да кажем че после мога да ги сравня с таблица от константи и да ги преобразувам в действителни числа.Имам чувството че тази функция изобщо не работи.Според вас ще работи ли това и ако не защо:

unsigned int Time;
float Rezultat;
char Buffer[15];
Rezultat=(1/Time)*60;
sprintf (Buffer, "%f",Rezultat);

е и.............. така ли трябва да е? Ако е така как да разбера в коя клетка от Buffer какво се е записало ,за да го взема от там .Къде е цялата част,точката и дробната част?Този размер на Buffer съм го задал условно,има ли начин да се знае предварително колко ще заеме стринга.Ще ви бъда благодарен ако имате някой готов ред за ползването на тази функция sprintf с толкова неясен синтаксис.


Вто Апр 04, 2006 7:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
Ъ? (s)printf да е с неясен синтаксис? явно не си попаднакл на добро ръководство :roll:

онова нещо, "%f" се нарича форматиращ стринг и служи за зададеш как да се форматира това, което печаташ.
в общия случай се слага число пред форматиращия стринг, като за реални числа, числото също е реално, например:
%5.2f ще форматира така хх.хх
5 е общото число на символите включително точката и знака, а 2 е броя на символите след точката
ако напишеш %-5.2f, форматирането ще е ляво подравнено (иначе е дясно)
ако напишеш %08.2f, незначещите символи от ляво ще се запълнят с нули вместо с интервал. знака сущо ще се премести:
-0001.23

намери си някъде копилатор на С с ANSI/posix printf и поекспериментирай на екран


Вто Апр 04, 2006 8:01 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Е убаво де, ама на човека му трябва изходните данни да са в BCD формат. Според мен е на прав път с масива от константи. Остава му да разбере как от float да направи int, та да си индексира масива.
Незнам дали има готова рецепта за това. Предполагам че преобразуването на типовете в С ще се омаже в случая.
Ако няма готово решение, трябва да се издири формата на float за конкретния компилатор (трябва да го има в документацията) и чрез математика (умножение) да се измъкне цялата част. Ама не може да няма по хитър метод за преобразуване на float във int.
Мисля че sprintf не му помага с нищо в случая. Той не пише на текстов дисплей, а на седемсегментен индикатор.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Вто Апр 04, 2006 8:27 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 16, 2006 5:20 pm
Мнения: 122
Местоположение: гр. Горна Оряховица
Мнение 
Не ми остава друго освен да вземам ASCII кодовете от резултата и да ги сравнявам с предварително записани константи(ASCII кодове) и по номера на индекса да разбирам какво е числото(от 0-9),понеже ми трябват само числа.Ако трябваше и букви,тогава щеше да му се завие свят на този процесор :D


Вто Апр 04, 2006 8:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
така де - получаваш стринг и после заместваш аскитата с твоите кодове, аз така те разбрах?


Вто Апр 04, 2006 8:59 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 16, 2006 5:20 pm
Мнения: 122
Местоположение: гр. Горна Оряховица
Мнение 
Точно това имах в предвид,но не знам в сметките всички променливи ,които участват трябва да са декларирани като float за да се получи резултат от типа float.


Вто Апр 04, 2006 9:06 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Юни 19, 2005 7:01 pm
Мнения: 15
Мнение 
ми формата ти е добър ето и примерче
http://ddas77.tripod.com/guide/programm ... rintf.html

ако искаш од float в int може да стане с %5.0f


Вто Апр 04, 2006 9:08 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Бе това е решение, ама е много грубо. Като цяло пълно форматираща функция sprintf, каквато ви трябва в случая се компилира като майка си и баща си по отношение на ресурси. А се опитваме да направим едно наглед просто преобразуване - float - BCD. За чии да се преминава през стринг?

Някъде из нета не може да няма дефиниран какъв е формата на float по ANSI С. Пусти 4 байта съдържат мантиса и експонента. После не би трябвало да е проблем да се извлече цялата част. sprintf го прави точно това.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Вто Апр 04, 2006 10:19 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Мисля че съм си играл преди с точно това,при явно преобразуване към int си работеше съвсем вярно.
Пробваи (int)Rezultat какво ще ти даде


Вто Апр 04, 2006 10:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Като начало, това Rezultat=(1/Time)*60; ще бъде винаги 0, или по-точно при Time>1 ;)


Сря Апр 05, 2006 12:35 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 16, 2006 5:20 pm
Мнения: 122
Местоположение: гр. Горна Оряховица
Мнение 
Ами така стана на практика sprintf ми извежда само 000000


Сря Апр 05, 2006 9:46 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 11 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни