реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Нехватает памяти под массив
Xenom0rph
сообщение Oct 6 2008, 11:41
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



На МК, ATtiny 2313 есть массив:
char *mas[15] = {"000000","000001","000010" ... "111111"}

Так вот массив вылезает за пределы допустимой памяти.
Дальше идёт сравнение строки. Котрую получила функция.
Впринципе я подумал а почему бы, не сделать так: если допустим первая строка массива равна входной строке, мы выходим из функции, если нет заменяем 1 элемент массива другой строкой, и так далее, памяти в разы будет меньше расходоваться!
Только вот у меня постаянная несовместимость типов.
Т.е я делаю так:
mass[i] = "111000";
и получаю ошибку типа нада бы использовать flash unsigned char, а если этот тип использовать, то функция strcmp не работает.
Вот два дня бьюсь, ничего невыходит.
Думал может в eeprom определить этот массив, определяю, strcmp не работает.
Может кто подскажет что нить?

P.S. использую Code VisionAVR;
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 6 2008, 11:50
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Для начала, char - это 1 байт.
Как туда можно затолкать mass[i] = "111000"; - может, объясните?
char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 6 2008, 12:15
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(MrYuran @ Oct 6 2008, 14:50) *
Для начала, char - это 1 байт.
Как туда можно затолкать mass[i] = "111000"; - может, объясните?
char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред
Ну ведь даже в Вашем сообщении не
Код
char mas[]

а
Код
char *mas[]

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Oct 6 2008, 12:16
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(MrYuran @ Oct 6 2008, 15:50) *
Для начала, char - это 1 байт.
Как туда можно затолкать mass[i] = "111000"; - может, объясните?
char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред

Это не бред, а просто массив указателей. Но задача все равно не понятна. А первая строчка sad.gif
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 6 2008, 12:26
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



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

Цитата(ReAl @ Oct 6 2008, 16:15) *
Проблема только в том, что и строки, и массив указателей на них лежат в ОЗУ (копируются из флеша в ОЗУ на старте программы), поэтому и не влазят.

Ну а можно это как нить решить?
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Oct 6 2008, 12:27
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Xenom0rph @ Oct 6 2008, 15:41) *
На МК, ATtiny 2313 есть массив:
char *mas[15] = {"000000","000001","000010" ... "111111"}

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

Не проще ли получаемую строку преобразовать в обычный char и искать его уже в массиве не из 15 строк, а как максимум из 15 char. Или из 15 элементов структуры (15*6=80 10 байт).
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 6 2008, 12:31
Сообщение #7


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Xenom0rph @ Oct 6 2008, 14:41) *
нада бы использовать flash unsigned char, а если этот тип использовать, то функция strcmp не работает.
Вот два дня бьюсь, ничего невыходит.
У avr-gcc для этого есть strcmp_P (и все остальные str-функции) - одна строка в ОЗУ, вторая во флеше.

Цитата(Xenom0rph @ Oct 6 2008, 14:41) *
P.S. использую Code VisionAVR;
Ну как-то же и у него это должно делаться...
Хотя в общем и целом - "бросьте каку" и перейдите на IAR или avr-gcc (WinAVR).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 6 2008, 12:31
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(VladimirYU @ Oct 6 2008, 16:16) *
Это не бред, а просто массив указателей.

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

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

Например, так:
Код
char ConvertFunction(char* string)
{
    char result=0;
    for (int i=0;i<5;i++)
    {
        if(string[i]=="1") result += 1<<i;
    }
    return(result);
}

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 6 2008, 12:38
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Xenom0rph @ Oct 6 2008, 15:26) *
суть в функцию приходит сточка типа "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;
}


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Oct 6 2008, 12:43
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



[quote name='MrYuran' date='Oct 6 2008, 16:31' post='481254']
Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?
[/quote]

Указатель инициализировать строкой нельзя, а строку на которую он указывает пожалуйста
там надо только
char __flash* mass[]={"str1", "srt2"....} (синтаксис IAR)

[/quote]
Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так?
По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число.
[/quote]

Да мы задачи то толком не знаем.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 6 2008, 12:45
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(MrYuran @ Oct 6 2008, 16:31) *
Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?

Очень даже можно, стандарт позволяет. Только это не значение указателя, а объект, на который он указывает.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 6 2008, 12:46
Сообщение #12


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(MrYuran @ Oct 6 2008, 15:31) *
Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?
Запросто. Строковый литерал имеет тип char*, поэтому им можно инициализировать как указатель, так и массив указателей.
Некоторые проблемы возникают у avr-gcc, но только при размещении строк во флеше и потому, что у него нет ключевого слова flash, означающего другой тип памяти, а есть только атрибут размещения переменной в секции, помещаемой во флеш. Атрибут применим к переменной, а не к литералу, только поэтому приходится заводить промежуточный массив char[].
При размещении массива указателей в ОЗУ инициализация их строковыми литераламаи - стандартная для С операция со времён создания языка.

Цитата(MrYuran @ Oct 6 2008, 15:31) *
Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так?
По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число.

Несомненно.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Oct 6 2008, 13:01
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(ReAl @ Oct 6 2008, 16:46) *
Запросто. Строковый литерал имеет тип char*, поэтому им можно инициализировать как указатель, так и массив указателей.
Некоторые проблемы возникают у avr-gcc, но только при размещении строк во флеше и потому, что у него нет ключевого слова flash, означающего другой тип памяти, а есть только атрибут размещения переменной в секции, помещаемой во флеш. Атрибут применим к переменной, а не к литералу, только поэтому приходится заводить промежуточный массив char[].
При размещении массива указателей в ОЗУ инициализация их строковыми литераламаи - стандартная для С операция со времён создания языка.
Несомненно.

Дык, что товарищу тогда делать то при недостатке памяти и при этой особенности GCC кроме, как перейти на другой компилятор? Я просто предлогаю путь уменьшения расхода памяти.
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 6 2008, 13:02
Сообщение #14


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Попробуем по другому
задача:
есть кодировка
000001 = 'A';
000010 = 'B';
100000 = 'C';
и так далее.
Так вот нужна такая функция, в которую входило допустим "000001";
мы сравнивали с имеющимися у нас строками, и присваивали переменной типа char наш символ.
Вот идея проекта.
Моя задумка была, реализовать все 15 кодов в массив, сравнить с прешедшей строчкой, получить номер элемента массива, и с помощью switch присвоить переменной значение.
Может есть какие более правильные или удобные решения?
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Oct 6 2008, 13:06
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Xenom0rph @ Oct 6 2008, 17:02) *
Попробуем по другому
задача:
есть кодировка
000001 = 'A';
000010 = 'B';
100000 = 'C';
и так далее.
Так вот нужна такая функция, в которую входило допустим "000001";
мы сравнивали с имеющимися у нас строками, и присваивали переменной типа char наш символ.
Вот идея проекта.
Моя задумка была, реализовать все 15 кодов в массив, сравнить с прешедшей строчкой, получить номер элемента массива, и с помощью switch присвоить переменной значение.
Может есть какие более правильные или удобные решения?

Получили строку, преобразовали в число, далее Ваш switch и массив вообще не нужен. ИМХО.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01494 секунд с 7
ELECTRONIX ©2004-2016