Перейти к содержанию
    

Нехватает памяти под массив

Если кодировку менять не предполагается, предлагаю дерево условий if-else. По-моему, самый простой и наименее затратный вариант. Во всех отношениях.

 

ReAl - спасибо за науку.

Век живи - век учись (с)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получили строку, преобразовали в число, далее Ваш switch и массив вообще не нужен. ИМХО.

А как 000001 преобразовать в число? а допустим 010000 это не одно и тоже получится, я вот плохо это представляю?

 

 

Если кодировку менять не предполагается, предлагаю дерево условий if-else. По-моему, самый простой и наименее затратный вариант. Во всех отношениях.

думал над этим только вот, беда

сравниваю допустим strcmpf("000001", string)

где string, это пришедшая строка

, а компилятор говорит мол тип надо поменять, я тут якобы использую flash unsigned char* , а надо просто unsigned char* вот!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

думал над этим только вот, беда

сравниваю допустим strcmpf("000001", string)

Я предлагаю строку анализировать посимвольно.

if(string[0]=="1")

{ if(string[1]=="1")

{ if(string[2]=="1")

{...}

...

}

else {}

}

else {}

}

else {}

 

получается дерево условий. 6 сравнений - и на выходе готовый результат в каком хотите виде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

получается дерево условий. 6 сравнений - и на выходе готовый результат в каком хотите виде.
Массив не нужен, зато теперь в процессор начинает не влезать код :) Там не 6, а 6! условий получится.

 

 

А как 000001 преобразовать в число? а допустим 010000 это не одно и тоже получится, я вот плохо это представляю?
Вам дали уже 2 примера в сообщениях №8 и №9. Более подробно www.google.com->"двоичная система счисления"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я предлагаю строку анализировать посимвольно.

if(string[0]=="1")

{ if(string[1]=="1")

{ if(string[2]=="1")

{...}

...

}

else {}

}

else {}

}

else {}

 

получается дерево условий. 6 сравнений - и на выходе готовый результат в каком хотите виде.

 

не не то... запутаешься нафиг, на краний случай оставлю, у верен другой выход есть!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё. Допёр.

Преобразуете вашу строку в число (как писалось ранее), а потом - switch-case.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

char *mas[15] = {"000000","000001","000010" ... "111111"}

 

Так вот массив вылезает за пределы допустимой памяти.

Интересно, а строк всего сколько ? Из шести бит по логике д.б. 64 строки, а массив всего на 15.

Про остальное уже написали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё. Допёр.

Преобразуете вашу строку в число (как писалось ранее), а потом - switch-case.

да это будет правильно, тоже доперло, всем огромное спасибо ;)

 

Интересно, а строк всего сколько ? Из шести бит по логике д.б. 64 строки, а массив всего на 15.

Про остальное уже написали.

сдесь не по логике, в кодировке всего 15 символ, вот...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понятно зачем у вас явное присвоение массиву указателей на переменные типа чар. Даже если вы заранее распределили где и какие переменные находятся в памяти, помните где начинается ОЗУ? А у вас mas[0]=0. Да и строка инициализации содержит десятичные числа. У вас есть ячейка ОЗУ с адресом 111111? Это что у тини ОЗУ более100кбайт?

 

Выложите полный текст а там можно думать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык, что товарищу тогда делать то при недостатке памяти и при этой особенности 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; // не нашлось такого кода
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понятно зачем у вас явное присвоение массиву указателей на переменные типа чар. Даже если вы заранее распределили где и какие переменные находятся в памяти, помните где начинается ОЗУ? А у вас mas[0]=0. Да и строка инициализации содержит десятичные числа. У вас есть ячейка ОЗУ с адресом 111111? Это что у тини ОЗУ более100кбайт?

 

Выложите полный текст а там можно думать.

 

Извиняюсь написал не в тему. Понял когда просмотрел все посты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...