| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| sprintf в С за AVR http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=2154 |
Страница 1 от 1 |
| Автор: | Ugeen [ Вто Апр 04, 2006 7:21 pm ] |
| Заглавие: | 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 8:01 pm ] |
| Заглавие: | |
Ъ? (s)printf да е с неясен синтаксис? явно не си попаднакл на добро ръководство онова нещо, "%f" се нарича форматиращ стринг и служи за зададеш как да се форматира това, което печаташ. в общия случай се слага число пред форматиращия стринг, като за реални числа, числото също е реално, например: %5.2f ще форматира така хх.хх 5 е общото число на символите включително точката и знака, а 2 е броя на символите след точката ако напишеш %-5.2f, форматирането ще е ляво подравнено (иначе е дясно) ако напишеш %08.2f, незначещите символи от ляво ще се запълнят с нули вместо с интервал. знака сущо ще се премести: -0001.23 намери си някъде копилатор на С с ANSI/posix printf и поекспериментирай на екран |
|
| Автор: | Цецо [ Вто Апр 04, 2006 8:27 pm ] |
| Заглавие: | |
Е убаво де, ама на човека му трябва изходните данни да са в BCD формат. Според мен е на прав път с масива от константи. Остава му да разбере как от float да направи int, та да си индексира масива. Незнам дали има готова рецепта за това. Предполагам че преобразуването на типовете в С ще се омаже в случая. Ако няма готово решение, трябва да се издири формата на float за конкретния компилатор (трябва да го има в документацията) и чрез математика (умножение) да се измъкне цялата част. Ама не може да няма по хитър метод за преобразуване на float във int. Мисля че sprintf не му помага с нищо в случая. Той не пише на текстов дисплей, а на седемсегментен индикатор. |
|
| Автор: | Ugeen [ Вто Апр 04, 2006 8:38 pm ] |
| Заглавие: | |
Не ми остава друго освен да вземам ASCII кодовете от резултата и да ги сравнявам с предварително записани константи(ASCII кодове) и по номера на индекса да разбирам какво е числото(от 0-9),понеже ми трябват само числа.Ако трябваше и букви,тогава щеше да му се завие свят на този процесор |
|
| Автор: | ДедоБоре [ Вто Апр 04, 2006 8:59 pm ] |
| Заглавие: | |
така де - получаваш стринг и после заместваш аскитата с твоите кодове, аз така те разбрах? |
|
| Автор: | Ugeen [ Вто Апр 04, 2006 9:06 pm ] |
| Заглавие: | |
Точно това имах в предвид,но не знам в сметките всички променливи ,които участват трябва да са декларирани като float за да се получи резултат от типа float. |
|
| Автор: | Nikolce [ Вто Апр 04, 2006 9:08 pm ] |
| Заглавие: | |
ми формата ти е добър ето и примерче http://ddas77.tripod.com/guide/programm ... rintf.html ако искаш од float в int може да стане с %5.0f |
|
| Автор: | Цецо [ Вто Апр 04, 2006 10:19 pm ] |
| Заглавие: | |
Бе това е решение, ама е много грубо. Като цяло пълно форматираща функция sprintf, каквато ви трябва в случая се компилира като майка си и баща си по отношение на ресурси. А се опитваме да направим едно наглед просто преобразуване - float - BCD. За чии да се преминава през стринг? Някъде из нета не може да няма дефиниран какъв е формата на float по ANSI С. Пусти 4 байта съдържат мантиса и експонента. После не би трябвало да е проблем да се извлече цялата част. sprintf го прави точно това. |
|
| Автор: | Nikola Kirov [ Вто Апр 04, 2006 10:30 pm ] |
| Заглавие: | |
Мисля че съм си играл преди с точно това,при явно преобразуване към int си работеше съвсем вярно. Пробваи (int)Rezultat какво ще ти даде |
|
| Автор: | Реконструктор [ Сря Апр 05, 2006 12:35 am ] |
| Заглавие: | |
Като начало, това Rezultat=(1/Time)*60; ще бъде винаги 0, или по-точно при Time>1 |
|
| Автор: | Ugeen [ Сря Апр 05, 2006 9:46 am ] |
| Заглавие: | |
Ами така стана на практика sprintf ми извежда само 000000 |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|