реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Нехватает памяти под массив
MrYuran
сообщение Oct 6 2008, 13:08
Сообщение #16


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

ReAl - спасибо за науку.
Век живи - век учись (с)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 6 2008, 13:16
Сообщение #17


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(VladimirYU @ Oct 6 2008, 17:06) *
Получили строку, преобразовали в число, далее Ваш switch и массив вообще не нужен. ИМХО.

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


Цитата(MrYuran @ Oct 6 2008, 17:08) *
Если кодировку менять не предполагается, предлагаю дерево условий if-else. По-моему, самый простой и наименее затратный вариант. Во всех отношениях.

думал над этим только вот, беда
сравниваю допустим strcmpf("000001", string)
где string, это пришедшая строка
, а компилятор говорит мол тип надо поменять, я тут якобы использую flash unsigned char* , а надо просто unsigned char* вот!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 6 2008, 13:24
Сообщение #18


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Xenom0rph @ Oct 6 2008, 17:16) *
думал над этим только вот, беда
сравниваю допустим strcmpf("000001", string)

Я предлагаю строку анализировать посимвольно.
if(string[0]=="1")
{ if(string[1]=="1")
{ if(string[2]=="1")
{...}
...
}
else {}
}
else {}
}
else {}

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 6 2008, 13:32
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(MrYuran @ Oct 6 2008, 16:24) *
получается дерево условий. 6 сравнений - и на выходе готовый результат в каком хотите виде.
Массив не нужен, зато теперь в процессор начинает не влезать код smile.gif Там не 6, а 6! условий получится.


Цитата(Xenom0rph @ Oct 6 2008, 16:16) *
А как 000001 преобразовать в число? а допустим 010000 это не одно и тоже получится, я вот плохо это представляю?
Вам дали уже 2 примера в сообщениях №8 и №9. Более подробно www.google.com->"двоичная система счисления"


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 6 2008, 13:33
Сообщение #20


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(MrYuran @ Oct 6 2008, 17:24) *
Я предлагаю строку анализировать посимвольно.
if(string[0]=="1")
{ if(string[1]=="1")
{ if(string[2]=="1")
{...}
...
}
else {}
}
else {}
}
else {}

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


не не то... запутаешься нафиг, на краний случай оставлю, у верен другой выход есть!!!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 6 2008, 13:35
Сообщение #21


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Oct 6 2008, 13:47
Сообщение #22


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(Xenom0rph @ Oct 6 2008, 11:41) *
char *mas[15] = {"000000","000001","000010" ... "111111"}

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

Интересно, а строк всего сколько ? Из шести бит по логике д.б. 64 строки, а массив всего на 15.
Про остальное уже написали.
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 6 2008, 13:51
Сообщение #23


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(MrYuran @ Oct 6 2008, 17:35) *
Всё. Допёр.
Преобразуете вашу строку в число (как писалось ранее), а потом - switch-case.

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

Цитата(Огурцов @ Oct 6 2008, 17:47) *
Интересно, а строк всего сколько ? Из шести бит по логике д.б. 64 строки, а массив всего на 15.
Про остальное уже написали.

сдесь не по логике, в кодировке всего 15 символ, вот...
Go to the top of the page
 
+Quote Post
NicSm
сообщение Oct 6 2008, 14:22
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 16-09-08
Из: Усть-Илимск
Пользователь №: 40 228



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

Выложите полный текст а там можно думать.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 6 2008, 15:25
Сообщение #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; // не нашлось такого кода
}


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
NicSm
сообщение Oct 8 2008, 15:39
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 16-09-08
Из: Усть-Илимск
Пользователь №: 40 228



Цитата(NicSm @ Oct 6 2008, 23:22) *
Не понятно зачем у вас явное присвоение массиву указателей на переменные типа чар. Даже если вы заранее распределили где и какие переменные находятся в памяти, помните где начинается ОЗУ? А у вас mas[0]=0. Да и строка инициализации содержит десятичные числа. У вас есть ячейка ОЗУ с адресом 111111? Это что у тини ОЗУ более100кбайт?

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


Извиняюсь написал не в тему. Понял когда просмотрел все посты.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 06:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016