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

 
 
> Использование realloc()
koluna
сообщение Jun 25 2009, 14:05
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Здравствуйте!

WinAVR 20071221.
scmRTOS 3.05.
ATmega48.

Выделяю память в цикле (последовательно добавляю по одному байту).

Код
...
unsigned int* Buffer_Size;
unsigned char* Buffer;
...
// В цикле.
(*Buffer_Size)++;
Buffer = (unsigned char*) realloc((unsigned char*)Buffer, *Buffer_Size);
...


При выделении на третьем байте realloc возвращает 0 почему?
Память кончилась? smile.gif

Благодарю заранее!

Когда делаю, допустим, так:
Код
...
unsigned char* PBuff;
...
PBuff = (unsigned char*) malloc(8);

то всё нормально...


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DpInRock
сообщение Jun 26 2009, 15:16
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Я в Сях ничего не понимаю, но ради развлечения не увидел, в каком месте перед realloc выделяется начальный буфер.
Realloc насколько я понимаю, просто изменяет размер уже существующего блока...

А так - это не просто безумие. Это даже для нормальных быстрых и замечательных процессорах с огромной памятью - безумие.

В устройствах на всяких мелких процессорах без юзерскго интерфейса наличие ситуаций "нет памяти" просто безумна.
Или если так приспичило "экономить", то проверять наличие памяти надо ДО приема. И соответтсвенно выставлять всякое разное для остановки потока данных (rts, там, DTR и прочая...).


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
koluna
сообщение Jun 29 2009, 06:08
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(DpInRock @ Jun 26 2009, 18:16) *
Я в Сях ничего не понимаю, но ради развлечения не увидел, в каком месте перед realloc выделяется начальный буфер.
Realloc насколько я понимаю, просто изменяет размер уже существующего блока...


avr-libc:
Цитата
It is acceptable to pass ptr as NULL, in which case realloc() will behave identical to malloc().

Т. е., если память изначально не выделена, то realloc() выделяет её подобно malloc().
Только вот указатель realloc() я передаю ненулевой... может в этом ещё дело...

А так - это не просто безумие. Это даже для нормальных быстрых и замечательных процессорах с огромной памятью - безумие.

Цитата
В устройствах на всяких мелких процессорах без юзерскго интерфейса наличие ситуаций "нет памяти" просто безумна.
Или если так приспичило "экономить", то проверять наличие памяти надо ДО приема. И соответтсвенно выставлять всякое разное для остановки потока данных (rts, там, DTR и прочая...).


У меня функция ошибку возвращает, если памяти не хватило smile.gif

Цитата(Сергей Борщ @ Jun 26 2009, 18:44) *
Сколько вы выделили под кучу?


Затрудняюсь ответить... sad.gif
Кроме вызова realloc(), free() я ничего с памятью не делал...
Нужно ещё как-то память под кучу выделить?


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 29 2009, 06:57
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(n_bogoyavlensky @ Jun 29 2009, 10:08) *
У меня функция ошибку возвращает, если памяти не хватило smile.gif


1. Вы же не сидите внутри вашего устройства. Кто (что) и каким образом будет реагировать на этот код ошибки?
2. Realloc - большое зло. Чем быстрее вы его изгоните из своей программы, тем лучше.
3. Если уж совсем в лом разбираться с размером heap (хотя, скорее всего в startup модуле есть соответствующий параметр) напишите простенький цикл с malloc(1), и быстро поймете размер кучи. Не забывайте про этом, что вам уже писали коллеги - у каждого выделенного блока есть еще накладные расходы в виде доп. байт на модуль.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- n_bogoyavlensky   Использование realloc()   Jun 25 2009, 14:05
- - SysRq   Из такого куска кода как-то не ясно начальное знач...   Jun 25 2009, 20:53
|- - n_bogoyavlensky   Цитата(SysRq @ Jun 25 2009, 23:53) Из так...   Jun 26 2009, 06:15
|- - zltigo   Цитата(n_bogoyavlensky @ Jun 26 2009, 09...   Jun 26 2009, 06:18
|- - n_bogoyavlensky   Цитата(zltigo @ Jun 26 2009, 09:18) Вы ст...   Jun 26 2009, 06:33
- - SysRq   Попробуйте инициализировать PBuff (присвоить NULL)...   Jun 26 2009, 06:44
|- - n_bogoyavlensky   Цитата(SysRq @ Jun 26 2009, 09:44) Попроб...   Jun 26 2009, 07:33
- - SysRq   Значит zltigo прав. Разбирайтесь сколько отведено ...   Jun 26 2009, 08:45
|- - n_bogoyavlensky   Цитата(SysRq @ Jun 26 2009, 11:45) Значит...   Jun 26 2009, 12:54
|- - Сергей Борщ   Цитата(n_bogoyavlensky @ Jun 29 2009, 09...   Jun 29 2009, 08:16
- - Сергей Борщ   Цитата(n_bogoyavlensky @ Jun 25 2009, 17...   Jun 26 2009, 15:44
- - SysRq   Гм. Я ж выше вам написал, что указатель проинициал...   Jun 29 2009, 08:30
- - n_bogoyavlensky   Цитата(SysRq @ Jun 29 2009, 11:30) Гм. Я ...   Jun 29 2009, 08:35


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 14:51
Рейтинг@Mail.ru


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