![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
получение значений массива из функции [D5, D6, Win95/98, WinME, Win2k, WinXP]
Александр_30 © (2002-04-25 09:20:00)Уважаемые знатоки Делфи! У меня к вам вопрос. Как из функции вернуть значения массива? Например:
function (a,b,c: int64): Int64;
Var
res: array of int64;
begin
while c<40 do
res[a]:=a*b/2;
Эта функция у меня в com сервере. Как вернуть все значения массива res в программу? Понимаю, что надо с помощью указателя это делать, но как? Можно с примером?
Александр_30 (2002-04-26 06:04:00) [1]DigitMan- спасибо. После некоторых адаптаций под свои нужды все заработало. Глюков вроде пока нет :) Всем участникам - спасибо. Сюда заглядывать больше не буду. Если есть еще какие комментарии - мыльте мылом (достаточно на ник кликнуть). Отвечу всем по мере возможности :)
P.S. SVP - оригинально! Обязательно возьму на заметку. В жизни все пригодится :)
SVM (2002-04-25 13:15:00) [2]type
TMyArray=array of Int64;
function MyFunc:TMyArray;
begin
SetLength(Result,2);
Result[0]:=1;
Result[1]:=2;
end;
Толик (2002-04-25 13:14:00) [3]С COM серверами ситуация та же самая: либо использовать массивы Variant (см. Digitman ©) либо написать свой класс-контейнер и вызывать его через интерфейсы.
Digitman (2002-04-25 13:10:00) [4]>Толик
COM-сервер (читай внимательно комментарии автора ) может быть и OutOfProcess-сервером. Что на это скажешь ?
Толик (2002-04-25 13:07:00) [5]>>Как из функции вернуть значения массива?
1. В ф-ю передать указатель на этот массив. После заполнения в этой ф-и массива можно обращаться к его эл-там.
Это самый простой способ, но и наиболее склонный к ошибкам, таким, как выход за границы диапазона, обращение к неинициализированной области памяти и т.д.
2. Наиболее правильное решение, на мой взгляд, оформить этот массив в виде класса, наподобие TList (кстати, чем не массив?). Всю низкоуровневую работу по проверке диапазона и всевозможной инициализации возьмёт на себя этот класс, а ф-я будет заботится только о том, чтобы передать ему правильные значения. Да и если возникнут ошибки, то их гороздо легче будет отловить, чем в первом случае.
Digitman (2002-04-25 12:51:00) [6]например, вот так :
1. код сервера
function TMyComServer.MyFunc(...): OleVariant;
...
var
SomeInt64Value: Int64;
begin
...
N := ... ; // размер массива (в дан.случае - одномерного)
...
Result := VarArrayCreate([0, N - 1], varDouble);
for i:= 0 to N - 1 do
begin
SomeInt64Value := ....;
Result[i] := PDouble(@SomeInt64Value)^;
end;
...
end;
2. код контроллера
var
ResultArray: Olevariant;
SomeInt64Value: Int64;
...
ResultArray := MyComServer.MyFunc(...);
for i:= 0 to ... do
PDouble(@SomeInt64Value)^ := ResultArray[i];
...
можно и оптимизировать, использовав VarArrayLock/Unlock
Anatoly Podgoretsky (2002-04-25 12:21:00) [7]Так приведи рабочий
Александр_30 (2002-04-25 12:09:00) [8]Ну тут вообще три ошибки, массив локальный, разрушается после выхода, цикл бесконечный - поможет только Ctrl+Alt+Del, массив неинициализирован - AV
-----------------------
Да не стоит зацикливаться на данном примере. Конечно же это только нерабочий шаблон. Мне важно другое, - как достать оттуда результаты сформированного массива :)
Anatoly Podgoretsky (2002-04-25 10:42:00) [9]Ну тут вообще три ошибки, массив локальный, разрушается после выхода, цикл бесконечный - поможет только Ctrl+Alt+Del, массив неинициализирован - AV
Андрей Сенченко (2002-04-25 09:26:00) [10]По-моему не так.
Объявляешь тип array of int64 и делаешь возврат функции в этот тип.
Не пробовал, но ИМХО должно пройти