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

Посимвольный прием строки неизвестной длинны

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

 

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

 

char * Buffer;

void add_char(u8_t c){

u8_t size = sizeof(Buffer);

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

}

 

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

 

PS. AVR GCC

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


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

Брр..

char * Buffer;

является указателем, а не массивом... Если вы хотите использовать указатель на массив, то проинициализируйте массив также:)

    int  array[16];
    int *ptr;
    ptr =  array;

 

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

Изменено пользователем Savrik

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


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

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

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

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


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

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

 

Вобщем способа лучше, чем выделить буфер фиксированной длинны нет?

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


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

Вобщем способа лучше, чем выделить буфер фиксированной длинны нет?

Выделять буферы в процессе работы :laughing: ...

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

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


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

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

Тогда задавайте вопросы ОБДУМАННО.

Вобщем способа лучше, чем выделить буфер фиксированной длинны нет?

Не имею понятия какую задачу Вы собираетесь решать. Думайте сами. Может и менеджер памяти выдающий память для полного фрейма много правильнее для Вашего случая, но то, что побайтный realloc есть полное безумие, это точно.

Кстати в самом Linux'е есть готовые системные вызовы.

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

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


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

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

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

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


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

Функциональность устойства проста. Подключается к Ethernet через ENC28J60, TCP/IP стек- uIP. Должно отвечать на пинги. Дрыгать ножками по команде с телнета, считывать состояние других ножек, принимать новую прошивку, самопрошиваться. Настраиваться по телнету. Телнет передает посимвольно данные. Поэтому и стоит задача приема данных посимвольно.

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


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

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

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


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

тогда зачем Вам городить непонятные конструкции? всякие данные к устройству есть команда, а команда есть конечное количество символов. Получили команду - обработали - очистили буфер. Определить максимально возможную длину команды будет несложно

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


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

....

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

 

P.S.

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

P.P.S.

Выбор железа видимо делался исключительно исключительно с целью спонсировать сразу двух производителей восьмибитовиков и для упражнений в "режиме жесткой экономии памяти"?

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


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

Выделите буфер на максимальную длину токена. А дальше - пусть Ваш девайс хоть Гамлета читает посимвольно. Это будет задача на другом уровне - кому и сколько локальных переменных требуется.

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


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

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

 

Это Вопрос не этого топика. Но uIP в место для бутлоадера ну никак не влезет. Предпологается прием прошивки, запись ее во внешнюю EEPROM, потом саморебут и старт бетлоадера, прошивающего МК прошивкой из внешнего EEPROM.

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


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

Возьмите уже ARM наконец!

Ага, можно и с Ethernet PHY на борту и человеческим кол-вом памяти.

А потом посчитайте по деньгам и поймите наконец, что пошли неправильным путём изначально :)

 

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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