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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Посимвольный прием строки неизвестной длинны
Skaf
сообщение Mar 9 2010, 10:13
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



Необходимо осуществлять прием данных неизвестной длинны. Работаю на AVR в режиме жесткой экономии памяти. Поэтому не хотелось бы выделять буфер размером как максимально возможная длинна строки.

Сначала я сделал так

Код
char * Buffer;

void add_char(u8_t c){

u8_t size = sizeof(Buffer);

realloc(Buffer, size+1);
Buffer[size] = c;

}


Но такой подход почему-то не работает. Какие еще есть варианты?

PS. AVR GCC
Go to the top of the page
 
+Quote Post
Savrik
сообщение Mar 9 2010, 10:30
Сообщение #2


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Брр..
Код
char * Buffer;
является указателем, а не массивом... Если вы хотите использовать указатель на массив, то проинициализируйте массив такжеsmile.gif
Код
    int  array[16];
    int *ptr;
    ptr =  array;


P.S. Вообще код странный и неправильный.. Используйте буферы, так проще..

Сообщение отредактировал Savrik - Mar 9 2010, 10:36
Go to the top of the page
 
+Quote Post
vanner
сообщение Mar 9 2010, 10:36
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 23-10-05
Пользователь №: 10 016



Прочитай еще раз, что делает sizeof() и подумай, почему твой код не работает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 9 2010, 10:44
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Skaf @ Mar 9 2010, 13:13) *
Но такой подход почему-то не работает. Какие еще есть варианты?

Ко всему предыдущему самое главное - абсолютное отсутствие представления о возможностях менеджера памяти sad.gif - на строку памяти жалко, а отдать здоровый кусок менеджеру и затем через заднепроходное отверстия порциями (причем далеко не байтовыми) получать и при этом ввиду отсутствия дефрагментации иметь гарантированные проблемы - это типа "нормально"......


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Skaf
сообщение Mar 9 2010, 11:21
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



Ну так потому я и здесь, чтобы научиться )) по-моему нормальный процесс

Вобщем способа лучше, чем выделить буфер фиксированной длинны нет?
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Mar 9 2010, 11:30
Сообщение #6


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(Skaf @ Mar 9 2010, 13:21) *
Вобщем способа лучше, чем выделить буфер фиксированной длинны нет?

Выделять буферы в процессе работы laughing.gif ...
А.Робинс "Linux программирование в примерах"... Там есть один пример - чтение строки произвольной длинны... Linux-не Linux, но видно как это делают... Конечно придется работать с динамической памятью... Кстати, в самом Linux'е есть готовые системные вызовы - getline(); getdelim(); .


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 9 2010, 11:38
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Skaf @ Mar 9 2010, 14:21) *
Ну так потому я и здесь, чтобы научиться )) по-моему нормальный процесс

Тогда задавайте вопросы ОБДУМАННО.
Цитата
Вобщем способа лучше, чем выделить буфер фиксированной длинны нет?

Не имею понятия какую задачу Вы собираетесь решать. Думайте сами. Может и менеджер памяти выдающий память для полного фрейма много правильнее для Вашего случая, но то, что побайтный realloc есть полное безумие, это точно.
Цитата(DRUID3 @ Mar 9 2010, 14:30) *
Кстати в самом Linux'е есть готовые системные вызовы.

Кстати, об AVR - там нет и не будет ни линукса, на хотя-бы возможности создать сколь-нибудь функциональный менеджер памяти. Да и и столько ресурсов, что-бы выбросить их на монстральнейшие системные вызовы с линуксовом стиле и близко нет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Mar 9 2010, 12:05
Сообщение #8


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(zltigo @ Mar 9 2010, 13:38) *
Кстати, об AVR - там нет и не будет ни линукса, на хотя-бы возможности создать сколь-нибудь функциональный менеджер памяти. Да и и столько ресурсов, что-бы выбросить их на монстральнейшие системные вызовы с линуксовом стиле и близко нет.

biggrin.gif Та я это знаю. Просто вдруг кто-то через поисковик найдет тему и ему будет нужно именно это... laughing.gif


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
Skaf
сообщение Mar 9 2010, 12:11
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



Функциональность устойства проста. Подключается к Ethernet через ENC28J60, TCP/IP стек- uIP. Должно отвечать на пинги. Дрыгать ножками по команде с телнета, считывать состояние других ножек, принимать новую прошивку, самопрошиваться. Настраиваться по телнету. Телнет передает посимвольно данные. Поэтому и стоит задача приема данных посимвольно.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 9 2010, 12:24
Сообщение #10


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

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



Писать строку в дополнительный стек, растущий навстречу основному, вплоть до пересечения и краха системы rolleyes.gif


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Savrik
сообщение Mar 9 2010, 12:28
Сообщение #11


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



тогда зачем Вам городить непонятные конструкции? всякие данные к устройству есть команда, а команда есть конечное количество символов. Получили команду - обработали - очистили буфер. Определить максимально возможную длину команды будет несложно
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 9 2010, 12:36
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Skaf @ Mar 9 2010, 15:11) *
....

Ну а теперь попробуйте объяснить, прежде всего самому себе, с кем из помянутых выше задач Вы собрались динамически делить память??!!

P.S.
В вопросе о вытаскивании себя за волосы перепрошивки самого себя по TCP/IP Вы полагаю, плаваете еще больше.
P.P.S.
Выбор железа видимо делался исключительно исключительно с целью спонсировать сразу двух производителей восьмибитовиков и для упражнений в "режиме жесткой экономии памяти"?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 9 2010, 12:54
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Выделите буфер на максимальную длину токена. А дальше - пусть Ваш девайс хоть Гамлета читает посимвольно. Это будет задача на другом уровне - кому и сколько локальных переменных требуется.
Go to the top of the page
 
+Quote Post
Skaf
сообщение Mar 9 2010, 13:54
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



>>В вопросе о вытаскивании себя за волосы перепрошивки самого себя по TCP/IP Вы полагаю, плаваете еще больше.

Это Вопрос не этого топика. Но uIP в место для бутлоадера ну никак не влезет. Предпологается прием прошивки, запись ее во внешнюю EEPROM, потом саморебут и старт бетлоадера, прошивающего МК прошивкой из внешнего EEPROM.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Mar 9 2010, 20:02
Сообщение #15


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Возьмите уже ARM наконец!
Ага, можно и с Ethernet PHY на борту и человеческим кол-вом памяти.
А потом посчитайте по деньгам и поймите наконец, что пошли неправильным путём изначально smile.gif

Манипуляции Ваши с внешним EEPROM тоже достаточно "интересны" smile.gif))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

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

 


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


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