Skaf 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Необходимо осуществлять прием данных неизвестной длинны. Работаю на AVR в режиме жесткой экономии памяти. Поэтому не хотелось бы выделять буфер размером как максимально возможная длинна строки. Сначала я сделал так char * Buffer; void add_char(u8_t c){ u8_t size = sizeof(Buffer); realloc(Buffer, size+1); Buffer[size] = c; } Но такой подход почему-то не работает. Какие еще есть варианты? PS. AVR GCC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Savrik 0 9 марта, 2010 Опубликовано 9 марта, 2010 (изменено) · Жалоба Брр.. char * Buffer; является указателем, а не массивом... Если вы хотите использовать указатель на массив, то проинициализируйте массив также:) int array[16]; int *ptr; ptr = array; P.S. Вообще код странный и неправильный.. Используйте буферы, так проще.. Изменено 9 марта, 2010 пользователем Savrik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vanner 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Прочитай еще раз, что делает sizeof() и подумай, почему твой код не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Но такой подход почему-то не работает. Какие еще есть варианты? Ко всему предыдущему самое главное - абсолютное отсутствие представления о возможностях менеджера памяти :( - на строку памяти жалко, а отдать здоровый кусок менеджеру и затем через заднепроходное отверстия порциями (причем далеко не байтовыми) получать и при этом ввиду отсутствия дефрагментации иметь гарантированные проблемы - это типа "нормально"...... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skaf 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Ну так потому я и здесь, чтобы научиться )) по-моему нормальный процесс Вобщем способа лучше, чем выделить буфер фиксированной длинны нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DRUID3 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Вобщем способа лучше, чем выделить буфер фиксированной длинны нет? Выделять буферы в процессе работы :laughing: ... А.Робинс "Linux программирование в примерах"... Там есть один пример - чтение строки произвольной длинны... Linux-не Linux, но видно как это делают... Конечно придется работать с динамической памятью... Кстати, в самом Linux'е есть готовые системные вызовы - getline(); getdelim(); . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Ну так потому я и здесь, чтобы научиться )) по-моему нормальный процесс Тогда задавайте вопросы ОБДУМАННО. Вобщем способа лучше, чем выделить буфер фиксированной длинны нет? Не имею понятия какую задачу Вы собираетесь решать. Думайте сами. Может и менеджер памяти выдающий память для полного фрейма много правильнее для Вашего случая, но то, что побайтный realloc есть полное безумие, это точно. Кстати в самом Linux'е есть готовые системные вызовы. Кстати, об AVR - там нет и не будет ни линукса, на хотя-бы возможности создать сколь-нибудь функциональный менеджер памяти. Да и и столько ресурсов, что-бы выбросить их на монстральнейшие системные вызовы с линуксовом стиле и близко нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DRUID3 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Кстати, об AVR - там нет и не будет ни линукса, на хотя-бы возможности создать сколь-нибудь функциональный менеджер памяти. Да и и столько ресурсов, что-бы выбросить их на монстральнейшие системные вызовы с линуксовом стиле и близко нет. Та я это знаю. Просто вдруг кто-то через поисковик найдет тему и ему будет нужно именно это... :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skaf 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Функциональность устойства проста. Подключается к Ethernet через ENC28J60, TCP/IP стек- uIP. Должно отвечать на пинги. Дрыгать ножками по команде с телнета, считывать состояние других ножек, принимать новую прошивку, самопрошиваться. Настраиваться по телнету. Телнет передает посимвольно данные. Поэтому и стоит задача приема данных посимвольно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Писать строку в дополнительный стек, растущий навстречу основному, вплоть до пересечения и краха системы :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Savrik 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба тогда зачем Вам городить непонятные конструкции? всякие данные к устройству есть команда, а команда есть конечное количество символов. Получили команду - обработали - очистили буфер. Определить максимально возможную длину команды будет несложно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба .... Ну а теперь попробуйте объяснить, прежде всего самому себе, с кем из помянутых выше задач Вы собрались динамически делить память??!! P.S. В вопросе о вытаскивании себя за волосы перепрошивки самого себя по TCP/IP Вы полагаю, плаваете еще больше. P.P.S. Выбор железа видимо делался исключительно исключительно с целью спонсировать сразу двух производителей восьмибитовиков и для упражнений в "режиме жесткой экономии памяти"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Выделите буфер на максимальную длину токена. А дальше - пусть Ваш девайс хоть Гамлета читает посимвольно. Это будет задача на другом уровне - кому и сколько локальных переменных требуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skaf 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба >>В вопросе о вытаскивании себя за волосы перепрошивки самого себя по TCP/IP Вы полагаю, плаваете еще больше. Это Вопрос не этого топика. Но uIP в место для бутлоадера ну никак не влезет. Предпологается прием прошивки, запись ее во внешнюю EEPROM, потом саморебут и старт бетлоадера, прошивающего МК прошивкой из внешнего EEPROM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 9 марта, 2010 Опубликовано 9 марта, 2010 · Жалоба Возьмите уже ARM наконец! Ага, можно и с Ethernet PHY на борту и человеческим кол-вом памяти. А потом посчитайте по деньгам и поймите наконец, что пошли неправильным путём изначально :) Манипуляции Ваши с внешним EEPROM тоже достаточно "интересны" :))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться