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

 
 
> Нехватает памяти под массив
Xenom0rph
сообщение Oct 6 2008, 11:41
Сообщение #1


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

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



На МК, ATtiny 2313 есть массив:
char *mas[15] = {"000000","000001","000010" ... "111111"}

Так вот массив вылезает за пределы допустимой памяти.
Дальше идёт сравнение строки. Котрую получила функция.
Впринципе я подумал а почему бы, не сделать так: если допустим первая строка массива равна входной строке, мы выходим из функции, если нет заменяем 1 элемент массива другой строкой, и так далее, памяти в разы будет меньше расходоваться!
Только вот у меня постаянная несовместимость типов.
Т.е я делаю так:
mass[i] = "111000";
и получаю ошибку типа нада бы использовать flash unsigned char, а если этот тип использовать, то функция strcmp не работает.
Вот два дня бьюсь, ничего невыходит.
Думал может в eeprom определить этот массив, определяю, strcmp не работает.
Может кто подскажет что нить?

P.S. использую Code VisionAVR;
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Oct 6 2008, 11:50
Сообщение #2


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

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



Для начала, char - это 1 байт.
Как туда можно затолкать mass[i] = "111000"; - может, объясните?
char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред


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


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(MrYuran @ Oct 6 2008, 15:50) *
Для начала, char - это 1 байт.
Как туда можно затолкать mass[i] = "111000"; - может, объясните?
char *mas[15] = {"000000","000001","000010" ... "111111"} - вообще бред

Это не бред, а просто массив указателей. Но задача все равно не понятна. А первая строчка sad.gif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 6 2008, 12:31
Сообщение #4


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

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



Цитата(VladimirYU @ Oct 6 2008, 16:16) *
Это не бред, а просто массив указателей.

Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?

Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так?
По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число.

Например, так:
Код
char ConvertFunction(char* string)
{
    char result=0;
    for (int i=0;i<5;i++)
    {
        if(string[i]=="1") result += 1<<i;
    }
    return(result);
}

ну чё-то в этом роде


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


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(MrYuran @ Oct 6 2008, 15:31) *
Тогда интересно, как можно инициализировать массив указателей значениями типа "000001"?
Запросто. Строковый литерал имеет тип char*, поэтому им можно инициализировать как указатель, так и массив указателей.
Некоторые проблемы возникают у avr-gcc, но только при размещении строк во флеше и потому, что у него нет ключевого слова flash, означающего другой тип памяти, а есть только атрибут размещения переменной в секции, помещаемой во флеш. Атрибут применим к переменной, а не к литералу, только поэтому приходится заводить промежуточный массив char[].
При размещении массива указателей в ОЗУ инициализация их строковыми литераламаи - стандартная для С операция со времён создания языка.

Цитата(MrYuran @ Oct 6 2008, 15:31) *
Я так полагаю, надо символьное представление двоичного числа преобразовать в число. Так?
По-моему, намного проще посимвольно проанализировать входящую строку и вычислить число.

Несомненно.


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


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

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



Попробуем по другому
задача:
есть кодировка
000001 = 'A';
000010 = 'B';
100000 = 'C';
и так далее.
Так вот нужна такая функция, в которую входило допустим "000001";
мы сравнивали с имеющимися у нас строками, и присваивали переменной типа char наш символ.
Вот идея проекта.
Моя задумка была, реализовать все 15 кодов в массив, сравнить с прешедшей строчкой, получить номер элемента массива, и с помощью switch присвоить переменной значение.
Может есть какие более правильные или удобные решения?
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Oct 6 2008, 13:06
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Xenom0rph @ Oct 6 2008, 17:02) *
Попробуем по другому
задача:
есть кодировка
000001 = 'A';
000010 = 'B';
100000 = 'C';
и так далее.
Так вот нужна такая функция, в которую входило допустим "000001";
мы сравнивали с имеющимися у нас строками, и присваивали переменной типа char наш символ.
Вот идея проекта.
Моя задумка была, реализовать все 15 кодов в массив, сравнить с прешедшей строчкой, получить номер элемента массива, и с помощью switch присвоить переменной значение.
Может есть какие более правильные или удобные решения?

Получили строку, преобразовали в число, далее Ваш switch и массив вообще не нужен. ИМХО.
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 6 2008, 13:16
Сообщение #8


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

Группа: Новичок
Сообщений: 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

Сообщений в этой теме
- Xenom0rph   Нехватает памяти под массив   Oct 6 2008, 11:41
|- - ReAl   Цитата(MrYuran @ Oct 6 2008, 14:50) Для н...   Oct 6 2008, 12:15
|- - Xenom0rph   Может как то подругому реалтзовать, суть в функцию...   Oct 6 2008, 12:26
||- - ReAl   Цитата(Xenom0rph @ Oct 6 2008, 15:26) сут...   Oct 6 2008, 12:38
|- - VladimirYU   [quote name='MrYuran' date='Oct 6 2008...   Oct 6 2008, 12:43
|- - aaarrr   Цитата(MrYuran @ Oct 6 2008, 16:31) Тогда...   Oct 6 2008, 12:45
|- - VladimirYU   Цитата(ReAl @ Oct 6 2008, 16:46) Запросто...   Oct 6 2008, 13:01
||- - ReAl   Цитата(VladimirYU @ Oct 6 2008, 16:01) Ды...   Oct 6 2008, 15:25
|- - MrYuran   Цитата(Xenom0rph @ Oct 6 2008, 17:16) дум...   Oct 6 2008, 13:24
|- - Сергей Борщ   Цитата(MrYuran @ Oct 6 2008, 16:24) получ...   Oct 6 2008, 13:32
|- - Xenom0rph   Цитата(MrYuran @ Oct 6 2008, 17:24) Я пре...   Oct 6 2008, 13:33
- - VladimirYU   Цитата(Xenom0rph @ Oct 6 2008, 15:41) На ...   Oct 6 2008, 12:27
- - ReAl   Цитата(Xenom0rph @ Oct 6 2008, 14:41) над...   Oct 6 2008, 12:31
- - MrYuran   Если кодировку менять не предполагается, предлагаю...   Oct 6 2008, 13:08
- - MrYuran   Всё. Допёр. Преобразуете вашу строку в число (как ...   Oct 6 2008, 13:35
|- - Xenom0rph   Цитата(MrYuran @ Oct 6 2008, 17:35) Всё. ...   Oct 6 2008, 13:51
- - Огурцов   Цитата(Xenom0rph @ Oct 6 2008, 11:41) cha...   Oct 6 2008, 13:47
- - NicSm   Не понятно зачем у вас явное присвоение массиву ук...   Oct 6 2008, 14:22
- - NicSm   Цитата(NicSm @ Oct 6 2008, 23:22) Не поня...   Oct 8 2008, 15:39


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

 


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


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