А может не надо стандартных библиотек? Руками коду меньше...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено PVA 02 мая 2004 г. 23:01
В ответ на: Подскажите - надо преобразовать float в строку. Использую функцию ftoa. Как определить, массив какого размера (максимум) понадобится для хранения результата ? отправлено Виноградов Алексей 02 мая 2004 г. 16:46

Подключение стандартных библиотек требует, извиняюсь, офигительных затрат. В 8152 при 8К ПЗУ это просто разорительно. Я использовал
например такой код. Код не преобразовывал, выделил как есть. Они использовался для преобразования SINGLE-формата в строку и посылки по COM-порту. Собственно надо SendByte заменить на сохранение в буфер строки.

SendByte(RS_WORK, (f_tmp.f < 0)?0x2D:0x20); /* знак "–" или пробел */
[3]
if (f_tmp.f < 0) /* модуль float */
f_tmp.f = –f_tmp.f;
[4]
for (i=0; i< iPoint; i++) /* точность */
f_tmp.f = f_tmp.f * 10.0;
[5]
for (i= 0; i < 7; i++) /* чистка буфера пробелами */
RSBuf[i] = 0x20;
[6]
for (i= 0; i < 7; i++){
if ((iPoint != i) || (iPoint == 0)) {
l = (unsigned long)f_tmp.f/10;
RSBuf[i] = (byte)((unsigned long)f_tmp.f – (unsigned long)l * 10.0);
RSBuf[i]+= 0x30; /* переводим из байта в десятичную цифру */
f_tmp.f = l;
} else {
RSBuf[i] = 0x2E; /* точка */
}
}
[7]
for (i= 0; i < 7; i++) /* посылаем число */
SendByte(RS_WORK, RSBuf[6 – i]);
[8]
/* символы конца посылки 0D, 0A*/
SendByt+e(RS_WORK, 13);
SendByte(RS_WORK, 10);

Размер буфера разумеется будет фиксированный и равен:
1 - знак минус или пробел
n - число знаков до запятой
m - число знаков после запятой
1/0 - 1, если m<>0, и 0, если m=0 (т.е. целове число)
итого 1+m+n+{1/0}

последнее надо чтобы не было чисел "123.", а было просто "123".
Подробности можно прочитать тут:
http://bhv.ftk.spbstu.ru/books/book.php?id=2732
http://www.ozon.ru/context/detail/id/1656093/

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru