Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

по рабоче-крестьянски просто...
А как сделать, чтобы минимум памяти ела ..

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


int fnSelect(int *arr)
{
   if(arr[0] == arr[1])
   {
      arr[2]=arr[0];
      return arr[0];
   }
   else
   {
      if(arr[0] == arr[2])
      {
         arr[1]=arr[0];
         return arr[0];
      }
      else
      {
         if(arr[1] == arr[2])
         {
            arr[0]=arr[1];
            return arr[1];
         }
      }
   }
   return -1;// ошибка
}

Реклама
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение IfoR »

ut1wpr писал(а):Так просто? :)
Вы пробовали? У вас работает? В IAR?
Позвольте усомниться в вашем совете.


На сколько я знаю, все эти _delay-и опираются только на эту константу.
Но я не говорю, что GCC-ассемблер будет работать в IAR-ом.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Реклама
juzik
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Re: Вопросы по С/С++ (СИ)

Сообщение juzik »

urry писал(а):

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


int fnSelect(int *arr)
{
   if(arr[0] == arr[1])
   {
      arr[2]=arr[0];
      return arr[0];
   }
   else
   {
      if(arr[0] == arr[2])
      {
         arr[1]=arr[0];
         return arr[0];
      }
      else
      {
         if(arr[1] == arr[2])
         {
            arr[0]=arr[1];
            return arr[1];
         }
      }
   }
   return -1;// ошибка
}



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

#define FALSE 0
#define TRUE 1
unsigned char fnSelect(int *arr)
{
   if(arr[0] == arr[1])
   {
      arr[2]=arr[0];
      return TRUE;
   }
   else
   {
      if(arr[0] == arr[2])
      {
         arr[1]=arr[0];
         return TRUE;
      }
      else
      {
         if(arr[1] == arr[2])
         {
            arr[0]=arr[1];
            return TRUE;
         }
      }
   }
   return FALSE;// ошибка
}

Думаю, это немного сократит используемую память. Значение можно будет получить из любой ячейки массива arr.
Имхо этот код не так уж много места будет отъедать. Я к тому что, если оптимизировать, то не отдельный участок кода, а просмотреть весь код на предмет уменьшения памяти.
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение AI_Disable »

Какую память нужно сэкономить? Если ОЗУ, то, похоже, поможет только инлайн, если ПЗУ, то асм.
Реклама
Эиком - электронные компоненты и радиодетали
Next13
Родился
Сообщения: 19
Зарегистрирован: Чт фев 18, 2010 21:07:54

Re: Вопросы по С/С++ (СИ)

Сообщение Next13 »

Аlex писал(а):Что значит "исправить" ? И как понять "ошибка" ?

Эти переменные храняться в EEPROM. Верней переменная одна просто она дублируется для контроля целостности. Т.е. если произошел сбой и в одну ячейку информация была записана не корректно ее нужно исправить.
Реклама
Next13
Родился
Сообщения: 19
Зарегистрирован: Чт фев 18, 2010 21:07:54

Re: Вопросы по С/С++ (СИ)

Сообщение Next13 »

juzik писал(а):
urry писал(а):Думаю, это немного сократит используемую память. Значение можно будет получить из любой ячейки массива arr.
Имхо этот код не так уж много места будет отъедать. Я к тому что, если оптимизировать, то не отдельный участок кода, а просмотреть весь код на предмет уменьшения памяти.

Весь код уже пересмотрен и оптимизирован(с учет моих познаний :))) ) Просто реально счет идет на байты.Спасибо.Так то уже все нормально, но дело уже принципа :)
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Next13 писал(а):Т.е. если произошел сбой и в одну ячейку информация была записана не корректно ее нужно исправить.
А если во все 3 запишется некорректно ? :)
Next13
Родился
Сообщения: 19
Зарегистрирован: Чт фев 18, 2010 21:07:54

Re: Вопросы по С/С++ (СИ)

Сообщение Next13 »

Аlex писал(а):
Next13 писал(а):Т.е. если произошел сбой и в одну ячейку информация была записана не корректно ее нужно исправить.
А если во все 3 запишется некорректно ? :)

ну вовсе три это врядли, по идеи не корректно может записаться, в основном, во время отключения(авария) питания. В EEPROM пишится один раз в минуту, это конечно не есть хорошо, но места уже нет чтобы организовать все это по хорошему. Но прибор будет работать не так часто и свои фунции сможет выполнять довольно долго с учетом ресурса записи в EEPROM.(да значение переменной не столь критичено, но надо :oops: )
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Next13 писал(а):Эти переменные храняТься в EEPROM.
Проверочный вопрос:Что делают?

juzik писал(а):Думаю, это немного сократит используемую память.

Каким образом? В обоих случаях возвращается учар.
В поисках истины человек развивается.
juzik
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Re: Вопросы по С/С++ (СИ)

Сообщение juzik »

vitalik_1984 писал(а):Каким образом? В обоих случаях возвращается учар.

В первом варианте возвращается значение переменной из массива. Т.е. нужно загрузить адрес массива, прибавить индекс элемента, прочитать (и, возможно) скопировать значение в выходной регистр.
Во втором варианте вернуть или 0 или 1.

Кроме того в первом случае возвращается не unsigned char (1 байт), а int (2 байта)
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение AI_Disable »

juzik, оптимизатор уже довольно хорошо умеет чистить всё лишнее и видеть код наперёд, чтоб 10 раз не загружать одни и те же переменные из памяти в регистры и т.п.. Так что тут сложно сказать, что будет лучше.
Да и вообще, неужели экономия в 1-2 байта это сегодня так существенно?
juzik
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Re: Вопросы по С/С++ (СИ)

Сообщение juzik »

AI_Disable писал(а):juzik, оптимизатор уже довольно хорошо умеет чистить всё лишнее и видеть код наперёд, чтоб 10 раз не загружать одни и те же переменные из памяти в регистры и т.п.. Так что тут сложно сказать, что будет лучше.

Не факт, надо разные варианты смотреть.

AI_Disable писал(а):Да и вообще, неужели экономия в 1-2 байта это сегодня так существенно?

Я уже писал, что:
juzik писал(а):Имхо этот код не так уж много места будет отъедать. Я к тому что, если оптимизировать, то не отдельный участок кода, а просмотреть весь код на предмет уменьшения памяти.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Вариант juzik:
Device: atmega8
Program: 290 bytes (3.5% Full)
(.text + .data + .bootloader)
Data: 6 bytes (0.6% Full)
(.data + .bss + .noinit)

Вариант urry
Device: atmega8
Program: 318 bytes (3.9% Full)
(.text + .data + .bootloader)
Data: 6 bytes (0.6% Full)
(.data + .bss + .noinit)

Это только функция и ее вызов в программе.
В поисках истины человек развивается.
juzik
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Re: Вопросы по С/С++ (СИ)

Сообщение juzik »

А какой уровень оптимизации включен? Он будет влиять на объем и скорость конечного кода.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Самый маленький код.Ведь как по условиям места мало вот я и поставил экономию места
В поисках истины человек развивается.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

juzik писал(а):Во втором варианте вернуть или 0 или 1.
Ну взвратился "0", а дальше что ? Опять анализ и гадание на коф. гуще : в каких же переменных правильные значения...
ТС'у нужно проанализировать переменные и отсеять/изменить ошибочные, ну или возвратить правильное значение, как я понял...

по условиям места мало вот я и поставил экономию места
По условиям было не только экономия места :)
Так можно просто возвращать переменные по одной, или указатель на весь массив, а там сам разбирайся какие у них там значения... Зато места мало займёт :)
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Дак сама функция уже все выравнивает.

arr[1]=arr[0];
return arr[0];
Вот если бы реально еще и адрес ячейки передавался то можно было бы анализировать.
В поисках истины человек развивается.
juzik
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Re: Вопросы по С/С++ (СИ)

Сообщение juzik »

Аlex писал(а):Ну взвратился "0", а дальше что ? Опять анализ и гадание на коф. гуще : в каких же переменных правильные значения...
ТС'у нужно проанализировать переменные и отсеять/изменить ошибочные, ну или возвратить правильное значение, как я понял...

"0" вернется лишь в случае 3 разных значений во всех ячейках массива. А эту инфу уже не восстановить. Так что гадать нечего.
"1" вернется если "ошибка исправлена" и новое значение одно и тоже в любой ячейке массива.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

vitalik_1984 писал(а):Дак сама функция уже все выравнивает.

arr[1]=arr[0];
return arr[0];
Тогда да, пойдёт. Не правильно понял, ссори. Думал что возвращает только 2 значения - есть/ нет ошибок.

Можно попробовать не передавать указатель, а сделать массив глобальным. Заполнили массив и вызвал ф-ию. Возможно меньше места займёт и побыстрее будет.
Не знаю как на Атмелах, на ПИКах работа через указатель более ресурсоёмкая нежели при прямой адресации.
juzik
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Re: Вопросы по С/С++ (СИ)

Сообщение juzik »

Аlex писал(а):Можно попробовать не передавать указатель, а сделать массив глобальным. Заполнили массив и вызвал ф-ию. Возможно меньше места займёт и побыстрее будет.

Думаю что врядли это поможет. Массив в любом случае будет создан в SRAM в случае локального объявления или глобального. Значит и код метода будет темже. Может снизиться объем вызывающего кода.
Ответить

Вернуться в «Разные вопросы по МК»