| Автор |
Съобщение |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 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 да е с неясен синтаксис? явно не си попаднакл на добро ръководство
онова нещо, "%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 |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Не ми остава друго освен да вземам ASCII кодовете от резултата и да ги сравнявам с предварително записани константи(ASCII кодове) и по номера на индекса да разбирам какво е числото(от 0-9),понеже ми трябват само числа.Ако трябваше и букви,тогава щеше да му се завие свят на този процесор 
|
| Вто Апр 04, 2006 8:38 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
така де - получаваш стринг и после заместваш аскитата с твоите кодове, аз така те разбрах?
|
| Вто Апр 04, 2006 8:59 pm |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Точно това имах в предвид,но не знам в сметките всички променливи ,които участват трябва да са декларирани като float за да се получи резултат от типа float.
|
| Вто Апр 04, 2006 9:06 pm |
|
 |
|
Nikolce
Ранг: Минаващ
Регистриран на: Нед Юни 19, 2005 7:01 pm Мнения: 15
|
ми формата ти е добър ето и примерче
http://ddas77.tripod.com/guide/programm ... rintf.html
ако искаш од float в int може да стане с %5.0f
|
| Вто Апр 04, 2006 9:08 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Бе това е решение, ама е много грубо. Като цяло пълно форматираща функция sprintf, каквато ви трябва в случая се компилира като майка си и баща си по отношение на ресурси. А се опитваме да направим едно наглед просто преобразуване - float - BCD. За чии да се преминава през стринг?
Някъде из нета не може да няма дефиниран какъв е формата на float по ANSI С. Пусти 4 байта съдържат мантиса и експонента. После не би трябвало да е проблем да се извлече цялата част. sprintf го прави точно това.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Вто Апр 04, 2006 10:19 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 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 |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Ами така стана на практика sprintf ми извежда само 000000
|
| Сря Апр 05, 2006 9:46 am |
|
|