помогите оптимизировать код по размеру

Обсуждаем контроллеры компании Atmel.
Ответить
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

А че просто вычитаниями не делать, сотен, десятков, единиц?!
У меня в одной программе была примерно такая функция

Код: Выделить всё

void parseUint(uint16_t val, uint8_t count, char* buffer)
{
	while(count>0)
	{
		uint16_t order=0;
		switch(count)
		{
			case 1: order=1; break;
			case 2: order=10; break;
			case 3: order=100; break;
			case 4: order=1000; break;
			case 5: order=10000; break;
		}
		if(!order) return;
		char i=0;
		while(order<=val)
		{
			val-=order;
			i++;
		}
		*buffer=i;
		buffer++;
		count--;
	}
}
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

при работе с WinAVR использование sprintf и ее вариаций в обычном виде прибавляет около 1,5-2К кода. если активировать поддержку float - то все 4К. если отказаться от некоторого количества режимов форматирования, оставив только минимум возможностей, то около 1,2К.

itoa и atoi прибавляют совсем незаметно, но приходится возиться с расстановкой символов по строке, в некоторых случаях может получиться хуже, чем с sprintf, но чаще бывает наоборот :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ks0 писал(а):А че просто вычитаниями не делать, сотен, десятков, единиц?!
а зачем? itoa давно существует и делает то же самое.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

Сообщение ESWANT »

[quote="ibiza11]
как Вам такой вариант?[/quote]

отладчик в мозгу показал что вроде последний
инкремент указателя str++; лишний :solder:

ну и значение zeroes не гарантирует заданную размерность строки
эта переменная просто показывает нужно ли добавлять ведущие нули до 3разрядов или нет
ну и бох с ним эту проверку сделаю в другом месте так будет опитмальнее :)))
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ESWANT, если вы активно используете в программе sprintf, то вам не удастся сэкономить память на самописной функции для заполнения нулями строки - это такая мизерная экономия, что и возиться с ней не стоит.

я вам повторно рекомендую все-таки использовать в нужных случаях нужный формат для sprintf:

Код: Выделить всё

sprintf(str, "%03.3d", 5); // в str будет помещено "005"
sprintf(str, "%03.3d", 15); // в str будет помещено "015"
строка для формата может быть во flash для пущей экономии, ну а если нужно, то строку формата можно создавать по ходу исполнения - об этом где-то здесь была отдельная темка...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

Сообщение ESWANT »

Если кому интересно - остановлюсь на таком коде:

Код: Выделить всё

//ПРЕОБРАЗОВЫВАЕТ БАЙТ В СТРОКУ С ЗАВЕРШАЮЩИМ НУЛЕМ
//f=0      -без ведущих нулей, реальной длины строка
//f=1,2,3  -фиксированная длина строки задана, дополним если число меньше слева нулями, если число больше то обрежем слева
   
void ByteToStr(byte f,byte b, unsigned char *str) 
{    
byte m[3];//под числа разрядов
          //[0]-сотни
          //[1]-десятки
          //[2]-единицы

int i;

m[0] = b/100;                                  //СОТНИ 255/100=2       5/100 = 0
m[1] = ( b - (m[0]*100) ) / 10;                //ДЕСЯТКИ  (255-(2*100)) / 10 =5        5-(0*100) /10 = 0
m[2] = ( b - (m[0]*100) - (m[1]*10) ) % 10;    //ЕДИНИЦЫ( 255 - (2*100) - (5*10) ) % 10;    


if (f) a = 3 - f;//начнем с нужного разряда собирать//фиксированная длина строки задана, дополним если надо слева нулями

else //нужна строка без ведущих нулей произвольной длины 
    {//найдем где начинаются не нули
     a=0;//начнем с сотен
     while ((m[a]==0)|(a<2)) a++;//ищем пока встретится не ноль или пока все разряды не пройдем
    }


for (i=a; i<3; i++)//перебираем разряды         
     {
     *str=m[i]+0x30; //и собираем строку
     str++;
     }//for


*str = _T('\0');//закончим строку

}//proc

Реклама
Ответить

Вернуться в «AVR»