Xenom0rph 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба На МК, ATtiny 2313 есть массив: char *mas[15] = {"000000","000001","000010" ... "111111"} Так вот массив вылезает за пределы допустимой памяти. Дальше идёт сравнение строки. Котрую получила функция. Впринципе я подумал а почему бы, не сделать так: если допустим первая строка массива равна входной строке, мы выходим из функции, если нет заменяем 1 элемент массива другой строкой, и так далее, памяти в разы будет меньше расходоваться! Только вот у меня постаянная несовместимость типов. Т.е я делаю так: mass = "111000"; и получаю ошибку типа нада бы использовать flash unsigned char, а если этот тип использовать, то функция strcmp не работает. Вот два дня бьюсь, ничего невыходит. Думал может в eeprom определить этот массив, определяю, strcmp не работает. Может кто подскажет что нить? P.S. использую Code VisionAVR; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 18 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Для начала, char - это 1 байт. Как туда можно затолкать mass = "111000"; - может, объясните? char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Для начала, char - это 1 байт. Как туда можно затолкать mass = "111000"; - может, объясните? char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред Ну ведь даже в Вашем сообщении не char mas[] а char *mas[] так что с этой точки зрения всё нормально, в массив ложатся указатели на строки, а сами строки лежат отдельно. Проблема только в том, что и строки, и массив указателей на них лежат в ОЗУ (копируются из флеша в ОЗУ на старте программы), поэтому и не влазят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Для начала, char - это 1 байт. Как туда можно затолкать mass = "111000"; - может, объясните? char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред Это не бред, а просто массив указателей. Но задача все равно не понятна. А первая строчка :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Может как то подругому реалтзовать, суть в функцию приходит сточка типа "xxxxxx", где x либо 1 либо 0, мы эту строчку сравниваем с имеющимися строками и если есть совпадения, то в переменную записываем порядковый номер? Проблема только в том, что и строки, и массив указателей на них лежат в ОЗУ (копируются из флеша в ОЗУ на старте программы), поэтому и не влазят. Ну а можно это как нить решить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба На МК, ATtiny 2313 есть массив: char *mas[15] = {"000000","000001","000010" ... "111111"} ...... Дальше идёт сравнение строки. Котрую получила функция. ....... Не проще ли получаемую строку преобразовать в обычный char и искать его уже в массиве не из 15 строк, а как максимум из 15 char. Или из 15 элементов структуры (15*6=80 10 байт). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба нада бы использовать flash unsigned char, а если этот тип использовать, то функция strcmp не работает. Вот два дня бьюсь, ничего невыходит. У avr-gcc для этого есть strcmp_P (и все остальные str-функции) - одна строка в ОЗУ, вторая во флеше. P.S. использую Code VisionAVR;Ну как-то же и у него это должно делаться... Хотя в общем и целом - "бросьте каку" и перейдите на IAR или avr-gcc (WinAVR). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 18 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Это не бред, а просто массив указателей. Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"? Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так? По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число. Например, так: char ConvertFunction(char* string) { char result=0; for (int i=0;i<5;i++) { if(string[i]=="1") result += 1<<i; } return(result); } ну чё-то в этом роде Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба суть в функцию приходит сточка типа "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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"? Указатель инициализировать строкой нельзя, а строку на которую он указывает пожалуйста там надо только char __flash* mass[]={"str1", "srt2"....} (синтаксис IAR) Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так? По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число. Да мы задачи то толком не знаем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"? Очень даже можно, стандарт позволяет. Только это не значение указателя, а объект, на который он указывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?Запросто. Строковый литерал имеет тип char*, поэтому им можно инициализировать как указатель, так и массив указателей. Некоторые проблемы возникают у avr-gcc, но только при размещении строк во флеше и потому, что у него нет ключевого слова flash, означающего другой тип памяти, а есть только атрибут размещения переменной в секции, помещаемой во флеш. Атрибут применим к переменной, а не к литералу, только поэтому приходится заводить промежуточный массив char[]. При размещении массива указателей в ОЗУ инициализация их строковыми литераламаи - стандартная для С операция со времён создания языка. Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так? По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число. Несомненно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Запросто. Строковый литерал имеет тип char*, поэтому им можно инициализировать как указатель, так и массив указателей. Некоторые проблемы возникают у avr-gcc, но только при размещении строк во флеше и потому, что у него нет ключевого слова flash, означающего другой тип памяти, а есть только атрибут размещения переменной в секции, помещаемой во флеш. Атрибут применим к переменной, а не к литералу, только поэтому приходится заводить промежуточный массив char[]. При размещении массива указателей в ОЗУ инициализация их строковыми литераламаи - стандартная для С операция со времён создания языка. Несомненно. Дык, что товарищу тогда делать то при недостатке памяти и при этой особенности GCC кроме, как перейти на другой компилятор? Я просто предлогаю путь уменьшения расхода памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Попробуем по другому задача: есть кодировка 000001 = 'A'; 000010 = 'B'; 100000 = 'C'; и так далее. Так вот нужна такая функция, в которую входило допустим "000001"; мы сравнивали с имеющимися у нас строками, и присваивали переменной типа char наш символ. Вот идея проекта. Моя задумка была, реализовать все 15 кодов в массив, сравнить с прешедшей строчкой, получить номер элемента массива, и с помощью switch присвоить переменной значение. Может есть какие более правильные или удобные решения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Попробуем по другому задача: есть кодировка 000001 = 'A'; 000010 = 'B'; 100000 = 'C'; и так далее. Так вот нужна такая функция, в которую входило допустим "000001"; мы сравнивали с имеющимися у нас строками, и присваивали переменной типа char наш символ. Вот идея проекта. Моя задумка была, реализовать все 15 кодов в массив, сравнить с прешедшей строчкой, получить номер элемента массива, и с помощью switch присвоить переменной значение. Может есть какие более правильные или удобные решения? Получили строку, преобразовали в число, далее Ваш switch и массив вообще не нужен. ИМХО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться