Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Programmers Notepad 2
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
RED_BULLok
Здравствуйте.

Суть вопроса: написал программку, помимо всего, использую в ней единожды функцию sprintf(); , размер выходного файла hex = 10 564 байт. Комментирую функцию sprintf(); размер hex = 5 569 байт !!! Решил дальше поэкспериментировать:раскомментировал функцию и продублировал строчку с ней - размер hex = 10 638 байт. Т.е размер скомпилированной функции 74 байта. Та же ситуация с операцией сдвига, только применил в программе +781 байт, дальнейшее применение этой операции вообще не влияет на размер выходного файла. Вот, думаю суть понятна.

Теперь вопрос: что так жестоко хавает память ? И есть какие соображения по устранению проблемы? Может в makefile нуна что-то прописать ?

P.S. использую дефолтовый makefile, изменял лишь название контроллера, частоту и имя файла проги.
Палыч
Цитата(RED_BULLok @ May 6 2008, 15:21) *
Теперь вопрос: что так жестоко хавает память ? И есть какие соображения по устранению проблемы?
Ну, и что тут не понятно? Вы сами, по-моему, всё объяснили своими примерами. Память едят процедуры, подключаемые из стандартных библиотек. Давно известно, что процедуры типа sprintf, scanf и еже с ними очень прожорливы до памити. Обычно, таких процедур несколько: разные возможности (только int, int+long, int+long+float) и, соответственно, разная потребность в памяти... Ну, и сдвиг (скорее всего не байта) - это тоже некая процедура, которая тоже отжирает память...
Ну, собственно, какие могут быть соображения? Не пользоваться стандартными printf и им подобными - обычно, можно написать свою более легкую функцию. Если памяти не хватает - попробовать включить оптимизацию по памяти...
DpInRock
Сама функция занимает много место.
Ее вызов - несколько байт. 10 вызовов - несколько байт умножить на 10.
RED_BULLok
Эх..... ясно. В атмегу8 так и не получится впихнуться. Взял 32-ю. Насчет своих функций.... влом изобретать колесо. Лучше уж на асм перепрыгну, сложно но верно.
Kuzmi4
2 RED_BULLok - вообсче то вы обрабатываете напильником паравоз чтобы получить вертолёт (был когда то давно такой анекдот....)
RED_BULLok
Цитата(Kuzmi4 @ May 6 2008, 16:23) *
2 RED_BULLok - вообсче то вы обрабатываете напильником паравоз чтобы получить вертолёт (был когда то давно такой анекдот....)


Ну помогите тогда написать аналог sprintf
Kuzmi4
2 RED_BULLok - а самому ??

Тут вроде описание есть -
http://www.codenet.ru/progr/cpp/spru/sprintf.php
Палыч
Цитата(RED_BULLok @ May 6 2008, 16:29) *
Ну помогите тогда написать аналог sprintf
Прямо-таки: аналог... Судя по вопросу - у Вас только один вызов этой функции. И, что он из себя представляет? Скорее всего Вы переводите в символы некоторую (возможно одну) переменную... Или группу переменных одного-двух типов... Вот Вам и нужна одна или две (три) функции типа itoa(), ltoa() или что-то подобное.
mdmitry
bb-offtopic.gif Почти. Уважаемый автор топика, пожалуйста, формулируйте тему верно. Programmers Notepad 2 к вопросу отношения не имеет.
RED_BULLok
Цитата(Палыч @ May 6 2008, 17:08) *
Прямо-таки: аналог... Судя по вопросу - у Вас только один вызов этой функции. И, что он из себя представляет? Скорее всего Вы переводите в символы некоторую (возможно одну) переменную... Или группу переменных одного-двух типов... Вот Вам и нужна одна или две (три) функции типа itoa(), ltoa() или что-то подобное.



Функцией sprintf() преобразую показания датчика температуры в стоку для вывода на ЖКИ (hd44780). Температура передается в двух байтах в 16-ричном числе, точность 0.5 град, т.е 20 град = 1400 для 20.5 град = 1480

Делаю так

if (((temp<<8)>>8) == 0x00)
{
sprintf(buf,"%d.0",(char)(temp>>8));
else
sprintf(buf,"%d.5",(char)(temp>>8));
}

В этом случае itoa(); никатит 05.gif

Может можно как-нить попроще выводить значения ?
vet
отчего же не катит?
Код
itoa(temp>>8,buf);
len = strlen(buf);
buf[len] = '.';
if (temp&0x80) buf[len+1] = '5'; else buf[len+1] = '0';
buf[len+2] = 0;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.