MrYuran 27 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Если кодировку менять не предполагается, предлагаю дерево условий if-else. По-моему, самый простой и наименее затратный вариант. Во всех отношениях. ReAl - спасибо за науку. Век живи - век учись (с) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Получили строку, преобразовали в число, далее Ваш switch и массив вообще не нужен. ИМХО. А как 000001 преобразовать в число? а допустим 010000 это не одно и тоже получится, я вот плохо это представляю? Если кодировку менять не предполагается, предлагаю дерево условий if-else. По-моему, самый простой и наименее затратный вариант. Во всех отношениях. думал над этим только вот, беда сравниваю допустим strcmpf("000001", string) где string, это пришедшая строка , а компилятор говорит мол тип надо поменять, я тут якобы использую flash unsigned char* , а надо просто unsigned char* вот! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба думал над этим только вот, беда сравниваю допустим strcmpf("000001", string) Я предлагаю строку анализировать посимвольно. if(string[0]=="1") { if(string[1]=="1") { if(string[2]=="1") {...} ... } else {} } else {} } else {} получается дерево условий. 6 сравнений - и на выходе готовый результат в каком хотите виде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба получается дерево условий. 6 сравнений - и на выходе готовый результат в каком хотите виде.Массив не нужен, зато теперь в процессор начинает не влезать код :) Там не 6, а 6! условий получится. А как 000001 преобразовать в число? а допустим 010000 это не одно и тоже получится, я вот плохо это представляю?Вам дали уже 2 примера в сообщениях №8 и №9. Более подробно www.google.com->"двоичная система счисления" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Я предлагаю строку анализировать посимвольно. if(string[0]=="1") { if(string[1]=="1") { if(string[2]=="1") {...} ... } else {} } else {} } else {} получается дерево условий. 6 сравнений - и на выходе готовый результат в каком хотите виде. не не то... запутаешься нафиг, на краний случай оставлю, у верен другой выход есть!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Всё. Допёр. Преобразуете вашу строку в число (как писалось ранее), а потом - switch-case. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба char *mas[15] = {"000000","000001","000010" ... "111111"} Так вот массив вылезает за пределы допустимой памяти. Интересно, а строк всего сколько ? Из шести бит по логике д.б. 64 строки, а массив всего на 15. Про остальное уже написали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Всё. Допёр. Преобразуете вашу строку в число (как писалось ранее), а потом - switch-case. да это будет правильно, тоже доперло, всем огромное спасибо ;) Интересно, а строк всего сколько ? Из шести бит по логике д.б. 64 строки, а массив всего на 15. Про остальное уже написали. сдесь не по логике, в кодировке всего 15 символ, вот... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NicSm 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Не понятно зачем у вас явное присвоение массиву указателей на переменные типа чар. Даже если вы заранее распределили где и какие переменные находятся в памяти, помните где начинается ОЗУ? А у вас mas[0]=0. Да и строка инициализации содержит десятичные числа. У вас есть ячейка ОЗУ с адресом 111111? Это что у тини ОЗУ более100кбайт? Выложите полный текст а там можно думать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба Дык, что товарищу тогда делать то при недостатке памяти и при этой особенности 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, ... }; Попробуем по другому задача: есть кодировка 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; // не нашлось такого кода } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NicSm 0 8 октября, 2008 Опубликовано 8 октября, 2008 · Жалоба Не понятно зачем у вас явное присвоение массиву указателей на переменные типа чар. Даже если вы заранее распределили где и какие переменные находятся в памяти, помните где начинается ОЗУ? А у вас mas[0]=0. Да и строка инициализации содержит десятичные числа. У вас есть ячейка ОЗУ с адресом 111111? Это что у тини ОЗУ более100кбайт? Выложите полный текст а там можно думать. Извиняюсь написал не в тему. Понял когда просмотрел все посты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться