Спасибо, я доработал Ваш первоначальный код, но увы - с указателями работа в Keil C51 не оптимальна по генерируемому коду :( Вот что получатся:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено Кулинар 23 августа 2003 г. 15:59
В ответ на: Ответ: Нет, неверный алгоритм, не додумал до конца. Здесь правильный (в развитие Вашей идеи) отправлено _Bill 23 августа 2003 г. 15:38

------------------------------------------------------
// Моя функция
//------------------------------------------------------
// Генерируемый код: 77 байт, обращения в библиотеку:
// - 2 раза LCALL ?C?UIDIV
// - 1 раз LCALL ?C?IMUL
------------------------------------------------------
#define LenStr 5
char Str[LenStr];

void IntToStr (uint Value) {
uchar i; uint k = 1;
// Набиваем строку вычесленными цифрами
for (i = LenStr; i > 0; i--) {
Str[i - 1] = '0' + ((Value / k) % 10);
k *= 10;
}
// Преобразуем лидирующие нули в пробелы
for (i = 0; i < LenStr - 1; i++) {
if (Str[i] == '0') Str[i] = ' '; else break;
}
}

------------------------------------------------------
// Функция на Вашем алгоритме
------------------------------------------------------
Генерируемый код: 111 байт, обращения в библиотеку:
- 2 раза LCALL ?C?UIDIV
- 2 раза LCALL ?C?CSTPTR
------------------------------------------------------
#define LenStr 5
char Str[LenStr];

void IntToStr2 (uint Value) {
uchar i, *ptr = Str + LenStr;
// Очищаем строку
for (i = 0; i < LenStr; i++) Str[i] = ' ';

// Набиваем строку вычесленными цифрами начиная с конца
while (Value >= 10) {
*--ptr = Value%10 + '0'; // преобразовать цифру
Value /= 10; //
}
*--ptr = Value + '0';
}



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

Ответы



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

E-mail: info@telesys.ru