Цитата(dimka2001 @ Mar 9 2006, 08:40)

Цитата
Но для конкретного случая лучше написать простенький цикл для вывода unsigned числа самостоятельно - экономится лишний кило памяти, и нет проблем со стеком.
например как?
Вопрос странный, задачка на уровне школы по предмету "Информатика".
Как вывести десятичное значение числа? Да 1000 и одним способом. Вот кусок, который я накидал когда-то на скорую руку для использования в отладочных дампах. Выводит число в виде 5 символов со значащими нулями. Другие варианты (с пробелами вместо нулей или переменной длины) - по аналогии, или найти можно где угодно. Писалось очень наскоро, прошу не критиковать стиль и т.п. - его там просто нет, это одноразовая затычка, которая просто прижилась в отладочном файле по причине того, что большего и не требуется. byte - это unsigned char, word - unsigned int.
Код
void print_XXXXX(word w)
{
byte buffer[5];
byte n = 5;
byte i;
for (i = 0; i < 5; i++)
{
byte d = w % 10;
buffer[--n] = d;
w = (w - d) / 10;
}
for (i = 0; i < 5; i++)
{
putchar(buffer[i] + '0');
}
}
PS. Посмотрев на написанное спустя пару лет, сразу бросилось в глаза, что многое можно оптимизировать. Например, вместо первого цикла по i использовать вариант с for (n=5; n;), убрав инициализацию n при объявлении (инициализировать хорошо там, где оно будет использовано). Тогда необходимость в i в первом цикле отпадает, а вывод можно организовать другой подручной функцией, например, выводящей n символов строки с указанного адреса (тогда и второй цикл по i станет не нужен). И т.п. Совершенству нет предела.
PPS. А если нужна аналогия со sprintf, то легко адрес буфера передавать как параметр, а возвращать ссылку на первый значащий символ строки (отбросив тем самым незначащие нули - ясное дело, что нужно установить флажок,где они начинаются, или искать первый ненулевой символ самому). И не забыть, что буфер должен быть или в параметрах, или статическим. А в конце буфера должен стоять символ конца строки '\0', которого при непосредственном выводе в примере нет за ненадобностью.
Сообщение отредактировал osnwt - Mar 9 2006, 08:54