Перейти к содержанию
    

Нехватает памяти под массив

На МК, ATtiny 2313 есть массив:

char *mas[15] = {"000000","000001","000010" ... "111111"}

 

Так вот массив вылезает за пределы допустимой памяти.

Дальше идёт сравнение строки. Котрую получила функция.

Впринципе я подумал а почему бы, не сделать так: если допустим первая строка массива равна входной строке, мы выходим из функции, если нет заменяем 1 элемент массива другой строкой, и так далее, памяти в разы будет меньше расходоваться!

Только вот у меня постаянная несовместимость типов.

Т.е я делаю так:

mass = "111000";

и получаю ошибку типа нада бы использовать flash unsigned char, а если этот тип использовать, то функция strcmp не работает.

Вот два дня бьюсь, ничего невыходит.

Думал может в eeprom определить этот массив, определяю, strcmp не работает.

Может кто подскажет что нить?

 

P.S. использую Code VisionAVR;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала, char - это 1 байт.

Как туда можно затолкать mass = "111000"; - может, объясните?

char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала, char - это 1 байт.

Как туда можно затолкать mass = "111000"; - может, объясните?

char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред

Ну ведь даже в Вашем сообщении не

char mas[]

а

char *mas[]

так что с этой точки зрения всё нормально, в массив ложатся указатели на строки, а сами строки лежат отдельно.

Проблема только в том, что и строки, и массив указателей на них лежат в ОЗУ (копируются из флеша в ОЗУ на старте программы), поэтому и не влазят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала, char - это 1 байт.

Как туда можно затолкать mass = "111000"; - может, объясните?

char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред

Это не бред, а просто массив указателей. Но задача все равно не понятна. А первая строчка :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может как то подругому реалтзовать,

суть в функцию приходит сточка типа "xxxxxx", где x либо 1 либо 0, мы эту строчку сравниваем с имеющимися строками и если есть совпадения, то в переменную записываем порядковый номер?

 

Проблема только в том, что и строки, и массив указателей на них лежат в ОЗУ (копируются из флеша в ОЗУ на старте программы), поэтому и не влазят.

Ну а можно это как нить решить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На МК, ATtiny 2313 есть массив:

char *mas[15] = {"000000","000001","000010" ... "111111"}

 

......

Дальше идёт сравнение строки. Котрую получила функция.

.......

Не проще ли получаемую строку преобразовать в обычный char и искать его уже в массиве не из 15 строк, а как максимум из 15 char. Или из 15 элементов структуры (15*6=80 10 байт).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нада бы использовать flash unsigned char, а если этот тип использовать, то функция strcmp не работает.

Вот два дня бьюсь, ничего невыходит.

У avr-gcc для этого есть strcmp_P (и все остальные str-функции) - одна строка в ОЗУ, вторая во флеше.

 

P.S. использую Code VisionAVR;
Ну как-то же и у него это должно делаться...

Хотя в общем и целом - "бросьте каку" и перейдите на IAR или avr-gcc (WinAVR).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не бред, а просто массив указателей.

Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?

 

Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так?

По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число.

 

Например, так:

char ConvertFunction(char* string) 
{
    char result=0;
    for (int i=0;i<5;i++)
    {
        if(string[i]=="1") result += 1<<i;
    }
    return(result);
}

ну чё-то в этом роде

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

суть в функцию приходит сточка типа "xxxxxx", где x либо 1 либо 0, мы эту строчку сравниваем с имеющимися строками и если есть совпадения, то в переменную записываем порядковый номер?

Ну а можно это как нить решить?

В общем случае - строки во флеше и strcmp_P(), в данном конкретном - проще преобразовывать запись двоичного числа в символьном виде в байт и таким образом получать код.

 

unsigned char get_code(const char *str)
{
    unsigned char u = 0;
    char ch;
    while( (ch = *str++) != 0 ) {
        u <<= 1;
        if( ch == '1') ++u;
    }
    return u;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?

 

Указатель инициализировать строкой нельзя, а строку на которую он указывает пожалуйста

там надо только

char __flash* mass[]={"str1", "srt2"....} (синтаксис IAR)

 

Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так?

По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число.

 

Да мы задачи то толком не знаем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?

Очень даже можно, стандарт позволяет. Только это не значение указателя, а объект, на который он указывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?
Запросто. Строковый литерал имеет тип char*, поэтому им можно инициализировать как указатель, так и массив указателей.

Некоторые проблемы возникают у avr-gcc, но только при размещении строк во флеше и потому, что у него нет ключевого слова flash, означающего другой тип памяти, а есть только атрибут размещения переменной в секции, помещаемой во флеш. Атрибут применим к переменной, а не к литералу, только поэтому приходится заводить промежуточный массив char[].

При размещении массива указателей в ОЗУ инициализация их строковыми литераламаи - стандартная для С операция со времён создания языка.

 

Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так?

По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число.

Несомненно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запросто. Строковый литерал имеет тип char*, поэтому им можно инициализировать как указатель, так и массив указателей.

Некоторые проблемы возникают у avr-gcc, но только при размещении строк во флеше и потому, что у него нет ключевого слова flash, означающего другой тип памяти, а есть только атрибут размещения переменной в секции, помещаемой во флеш. Атрибут применим к переменной, а не к литералу, только поэтому приходится заводить промежуточный массив char[].

При размещении массива указателей в ОЗУ инициализация их строковыми литераламаи - стандартная для С операция со времён создания языка.

Несомненно.

Дык, что товарищу тогда делать то при недостатке памяти и при этой особенности GCC кроме, как перейти на другой компилятор? Я просто предлогаю путь уменьшения расхода памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуем по другому

задача:

есть кодировка

000001 = 'A';

000010 = 'B';

100000 = 'C';

и так далее.

Так вот нужна такая функция, в которую входило допустим "000001";

мы сравнивали с имеющимися у нас строками, и присваивали переменной типа char наш символ.

Вот идея проекта.

Моя задумка была, реализовать все 15 кодов в массив, сравнить с прешедшей строчкой, получить номер элемента массива, и с помощью switch присвоить переменной значение.

Может есть какие более правильные или удобные решения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуем по другому

задача:

есть кодировка

000001 = 'A';

000010 = 'B';

100000 = 'C';

и так далее.

Так вот нужна такая функция, в которую входило допустим "000001";

мы сравнивали с имеющимися у нас строками, и присваивали переменной типа char наш символ.

Вот идея проекта.

Моя задумка была, реализовать все 15 кодов в массив, сравнить с прешедшей строчкой, получить номер элемента массива, и с помощью switch присвоить переменной значение.

Может есть какие более правильные или удобные решения?

Получили строку, преобразовали в число, далее Ваш switch и массив вообще не нужен. ИМХО.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...