Цитата(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; // не нашлось такого кода
}