|
Нехватает памяти под массив |
|
|
|
Oct 6 2008, 11:41
|
Частый гость
 
Группа: Новичок
Сообщений: 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;
|
|
|
|
|
 |
Ответов
|
Oct 6 2008, 12:31
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
Oct 6 2008, 12:46
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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)  Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так? По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число. Несомненно.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 6 2008, 13:01
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

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

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

|
Цитата(VladimirYU @ Oct 6 2008, 16:01)  Дык, что товарищу тогда делать то при недостатке памяти и при этой особенности GCC кроме, как перейти на другой компилятор? Я просто предлогаю путь уменьшения расхода памяти. Не понял вопроса. У товарища CV, а не GCC, как ему бороться с его особенностями, я не знаю. В конкретном случае товарища я уже написал в сообщении 9 фрагмент кода, как из ASCII записи двочиного числа получить код коротким циклом без массивов вообще. В общем случае нужен массив указателей на строки char *array[] во флеше (при строках одинаковой длины можно массив строк char array[][] ). А особенность GCC из-за его непонимания разных пространств памяти всего лишь вынуждает вместо Код const flash char * const flash array[] = { "00000", "00001", ... }; писать Код const prog_char str0[] = "00000"; const prog_char str1[] = "00001"; ... const prog_char *array[] PROGMEM = { str1, str2, ... }; Цитата(Xenom0rph @ Oct 6 2008, 16:02)  Попробуем по другому задача: есть кодировка 000001 = 'A'; 000010 = 'B'; 100000 = 'C'; и так далее. Так вот нужна такая функция, в которую входило допустим "000001"; мы сравнивали с имеющимися у нас строками, и присваивали переменной типа char наш символ. Функция get_code() берётся из сообщения 9 (или 8, но её тогда лучше переписать так: Код char ConvertFunction(const char *string) { char result=0; for (unsigned char mask=0x01; mask < (1<<5); mask <<= 1) if( *string++ == '1' ) result += mask;
return(result); } Дальше если бы все сиволы в кодировке сидели "плотно" (т.е. при 6-битовом коде есть "ну почти все" 64 символа", то так (чтобы не затенять суть, пишу НЕ как для GCC, у него нужно несколько морочливее, если я правильно помню IAR, то им это должно скомпилироваться): Код const flash char code_table[64] = { 0, /* например, это неиспользуемый код */ 'A', 'B', 'Z', /* используемые */ ... };
char decode_char( const char *str) { // вменяемый компилятор подставит get_table() inline // желательно get_table() объявить как static return code_table[ get_char(str) ]; } Для разреженной таблицы кодов (исползуется 15 кодов из 64 и "врассыпку") посложнее, но всё равно должно занять во флеше меньше памяти, чем switch (хотя в среднем может работать дольше, тут надо выбирать): Код typedef struct { unsigned char code; char ch; } code_map_entry; const flash code_map_entry code_map[] = { { 0x01, 'A'}, { 0x02, 'B'}, { 0x20, 'C'} };
char decode_char( const char *str) { unsigned char code = get_code(str); const flash code_map_entry *ptr = code_map; unsigned char i; for( i = 0; i < sizeof( code_map ) / sizeof( code_map_entry); ++i, ++ptr) if( code == ptr->code) return ptr->ch; return 0; // не нашлось такого кода }
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
Xenom0rph Нехватает памяти под массив Oct 6 2008, 11:41 ReAl Цитата(MrYuran @ Oct 6 2008, 14:50) Для н... Oct 6 2008, 12:15  Xenom0rph Может как то подругому реалтзовать,
суть в функцию... Oct 6 2008, 12:26   ReAl Цитата(Xenom0rph @ Oct 6 2008, 15:26) сут... Oct 6 2008, 12:38   VladimirYU [quote name='MrYuran' date='Oct 6 2008... Oct 6 2008, 12:43   aaarrr Цитата(MrYuran @ Oct 6 2008, 16:31) Тогда... Oct 6 2008, 12:45    Xenom0rph Попробуем по другому
задача:
есть кодировка
000001... Oct 6 2008, 13:02     VladimirYU Цитата(Xenom0rph @ Oct 6 2008, 17:02) Поп... Oct 6 2008, 13:06      Xenom0rph Цитата(VladimirYU @ Oct 6 2008, 17:06) По... Oct 6 2008, 13:16       MrYuran Цитата(Xenom0rph @ Oct 6 2008, 17:16) дум... Oct 6 2008, 13:24        Сергей Борщ Цитата(MrYuran @ Oct 6 2008, 16:24) получ... Oct 6 2008, 13:32        Xenom0rph Цитата(MrYuran @ Oct 6 2008, 17:24) Я пре... Oct 6 2008, 13:33 VladimirYU Цитата(Xenom0rph @ Oct 6 2008, 15:41) На ... Oct 6 2008, 12:27 ReAl Цитата(Xenom0rph @ Oct 6 2008, 14:41) над... Oct 6 2008, 12:31 MrYuran Если кодировку менять не предполагается, предлагаю... Oct 6 2008, 13:08 MrYuran Всё. Допёр.
Преобразуете вашу строку в число (как ... Oct 6 2008, 13:35 Xenom0rph Цитата(MrYuran @ Oct 6 2008, 17:35) Всё. ... Oct 6 2008, 13:51 Огурцов Цитата(Xenom0rph @ Oct 6 2008, 11:41) cha... Oct 6 2008, 13:47 NicSm Не понятно зачем у вас явное присвоение массиву ук... Oct 6 2008, 14:22 NicSm Цитата(NicSm @ Oct 6 2008, 23:22) Не поня... Oct 8 2008, 15:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|