|
Посимвольный прием строки неизвестной длинны |
|
|
|
Mar 9 2010, 10:13
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 9 2010, 10:30
|

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

|
Брр.. Код char * Buffer; является указателем, а не массивом... Если вы хотите использовать указатель на массив, то проинициализируйте массив также  Код int array[16]; int *ptr; ptr = array; P.S. Вообще код странный и неправильный.. Используйте буферы, так проще..
Сообщение отредактировал Savrik - Mar 9 2010, 10:36
|
|
|
|
|
Mar 9 2010, 10:36
|
Участник

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

|
Прочитай еще раз, что делает sizeof() и подумай, почему твой код не работает.
|
|
|
|
|
Mar 9 2010, 11:30
|

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

|
Цитата(Skaf @ Mar 9 2010, 13:21)  Вобщем способа лучше, чем выделить буфер фиксированной длинны нет? Выделять буферы в процессе работы  ... А.Робинс "Linux программирование в примерах"... Там есть один пример - чтение строки произвольной длинны... Linux-не Linux, но видно как это делают... Конечно придется работать с динамической памятью... Кстати, в самом Linux'е есть готовые системные вызовы - getline(); getdelim(); .
--------------------
Нас помнят пока мы мешаем другим... //-------------------------------------------------------- Хороший блатной - мертвый... //-------------------------------------------------------- Нет старик, это те дроиды которых я ищу...
|
|
|
|
|
Mar 9 2010, 11:38
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 9 2010, 12:36
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|