Элементрарный вопрос. Как возвращать массив из функции
От: Аноним  
Дата: 13.07.05 05:12
Оценка:
У меня есть функия в DLL, возвращающая некий массив. Так как до вызова этой функции размер неизвестен, а надо возвращать float*, то я завожу некий статический буфер максимального размера, заполняю его, возвращаю указатель на него и размер.

ПРОБЛЕМЫ — пользователь запомининает этот указатель, а после вызова этой функции в другой раз эти данные затираются.
Еще проблема — многопоточность — этим все сказано

Так вот вопрос — как поэлегантнее возвращать массив, чтобы память выделялась и освобождалась в DLL и не было вышеуказанных проблем.
STL не предлагать

СПАСИБО
Re: Элементрарный вопрос. Как возвращать массив из функции
От: _Winnie Россия C++.freerun
Дата: 13.07.05 06:10
Оценка: 23 (1)
Здравствуйте, Аноним, Вы писали:

Сходу два способа.
1) Память выделяет вызывающая сторона

int Legnth = ::GetArrayLength();
float *Buffer = new float[Length];
::ReadArray(Buffer);

2) память выделяет вызываемая сторона

float *Buffer = ::GetArray(); //внутри происходит выделение памяти
....
::ReleaseArray(Buffer); //внутри происходит освобождение памяти
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Элементрарный вопрос. Как возвращать массив из функции
От: MaximE Великобритания  
Дата: 13.07.05 07:25
Оценка: 23 (1)
On Wed, 13 Jul 2005 09:12:36 +0400, wrote:

> У меня есть функия в DLL, возвращающая некий массив. Так как до вызова этой функции размер неизвестен, а надо возвращать float*, то я завожу некий статический буфер максимального размера, заполняю его, возвращаю указатель на него и размер.

>
> ПРОБЛЕМЫ — пользователь запомининает этот указатель, а после вызова этой функции в другой раз эти данные затираются.
> Еще проблема — многопоточность — этим все сказано

Выделяй массив на хипе.

> Так вот вопрос — как поэлегантнее возвращать массив, чтобы память выделялась и освобождалась в DLL и не было вышеуказанных проблем.


Определи массив как:

struct float_array
{
     float* p;
     size_t n;
};


И пусть твоя разделяемая библиотека экспортирует ф-ции:
float_array allocate_float_array(size_t n)
{
     float_array a;
     a.p = (float*)malloc(sizeof(float) * n);
     a.n = n;
     return a;
}

void deallocate_float_array(float_array a)
{
     free(a.p);
}


Пользователь закончив работать с объктом float_array, вызывает ф-цию твоей библиотеки deallocate_float_array, чтобы освободить память, занимаемую массивом.

На С++ можно накрутить так, чтобы пользователю не пришлось явно вызывать deallocate_float_array.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re: Элементрарный вопрос. Как возвращать массив из функции
От: ku12345  
Дата: 13.07.05 11:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня есть функия в DLL, возвращающая некий массив. Так как до вызова этой функции размер неизвестен, а надо возвращать float*, то я завожу некий статический буфер максимального размера, заполняю его, возвращаю указатель на него и размер.


А>ПРОБЛЕМЫ — пользователь запомининает этот указатель, а после вызова этой функции в другой раз эти данные затираются.

А>Еще проблема — многопоточность — этим все сказано

А>Так вот вопрос — как поэлегантнее возвращать массив, чтобы память выделялась и освобождалась в DLL и не было вышеуказанных проблем.

А>STL не предлагать

А>СПАСИБО

Принимай в качестве параметра функции указатель на внешний объект(класс типа связанного списка, СObjList экземпляр например в MFC), внутри работай с ним, типа Add|Remove item-s,
потом возвращай указатель на этот же объект. Если ни MFC ни STL, то сделай сам связный список из объектов и делай там те же ADD|Remove — ...После этого ты на время пребывания внутри функции делаешь с таким динамическим массивом что угодно, пользователь отдыхает, так как для него будет доступен только указатель на список полностью контролируемый тобой. Что захочешь то и нафасуешь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.