Элементрарный вопрос. Как возвращать массив из функции
От:
Аноним
Дата:
13.07.05 05:12
Оценка:
У меня есть функия в DLL, возвращающая некий массив. Так как до вызова этой функции размер неизвестен, а надо возвращать float*, то я завожу некий статический буфер максимального размера, заполняю его, возвращаю указатель на него и размер.
ПРОБЛЕМЫ — пользователь запомининает этот указатель, а после вызова этой функции в другой раз эти данные затираются.
Еще проблема — многопоточность — этим все сказано
Так вот вопрос — как поэлегантнее возвращать массив, чтобы память выделялась и освобождалась в DLL и не было вышеуказанных проблем.
STL не предлагать
СПАСИБО
Re: Элементрарный вопрос. Как возвращать массив из функции
On Wed, 13 Jul 2005 09:12:36 +0400, wrote:
> У меня есть функия в DLL, возвращающая некий массив. Так как до вызова этой функции размер неизвестен, а надо возвращать float*, то я завожу некий статический буфер максимального размера, заполняю его, возвращаю указатель на него и размер. > > ПРОБЛЕМЫ — пользователь запомининает этот указатель, а после вызова этой функции в другой раз эти данные затираются. > Еще проблема — многопоточность — этим все сказано
Выделяй массив на хипе.
> Так вот вопрос — как поэлегантнее возвращать массив, чтобы память выделялась и освобождалась в DLL и не было вышеуказанных проблем.
Определи массив как:
struct float_array
{
float* p;
size_t n;
};
И пусть твоя разделяемая библиотека экспортирует ф-ции:
Пользователь закончив работать с объктом float_array, вызывает ф-цию твоей библиотеки deallocate_float_array, чтобы освободить память, занимаемую массивом.
На С++ можно накрутить так, чтобы пользователю не пришлось явно вызывать deallocate_float_array.
-- Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re: Элементрарный вопрос. Как возвращать массив из функции
Здравствуйте, Аноним, Вы писали:
А>У меня есть функия в DLL, возвращающая некий массив. Так как до вызова этой функции размер неизвестен, а надо возвращать float*, то я завожу некий статический буфер максимального размера, заполняю его, возвращаю указатель на него и размер.
А>ПРОБЛЕМЫ — пользователь запомининает этот указатель, а после вызова этой функции в другой раз эти данные затираются. А>Еще проблема — многопоточность — этим все сказано
А>Так вот вопрос — как поэлегантнее возвращать массив, чтобы память выделялась и освобождалась в DLL и не было вышеуказанных проблем. А>STL не предлагать
А>СПАСИБО
Принимай в качестве параметра функции указатель на внешний объект(класс типа связанного списка, СObjList экземпляр например в MFC), внутри работай с ним, типа Add|Remove item-s,
потом возвращай указатель на этот же объект. Если ни MFC ни STL, то сделай сам связный список из объектов и делай там те же ADD|Remove — ...После этого ты на время пребывания внутри функции делаешь с таким динамическим массивом что угодно, пользователь отдыхает, так как для него будет доступен только указатель на список полностью контролируемый тобой. Что захочешь то и нафасуешь.