Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
Внизполучение значений массива из функции Найти похожие ветки
← →
Александр_30 (2002-04-25 09:20) [0]Уважаемые знатоки Делфи! У меня к вам вопрос. Как из функции вернуть значения массива? Например:
function (a,b,c: int64): Int64;
Var
res: array of int64;
begin
while c<40 do
res[a]:=a*b/2;
Эта функция у меня в com сервере. Как вернуть все значения массива res в программу? Понимаю, что надо с помощью указателя это делать, но как? Можно с примером?
← →
Андрей Сенченко (2002-04-25 09:26) [1]По-моему не так.
Объявляешь тип array of int64 и делаешь возврат функции в этот тип.
Не пробовал, но ИМХО должно пройти
← →
Anatoly Podgoretsky (2002-04-25 10:42) [2]Ну тут вообще три ошибки, массив локальный, разрушается после выхода, цикл бесконечный - поможет только Ctrl+Alt+Del, массив неинициализирован - AV
← →
Александр_30 (2002-04-25 12:09) [3]Ну тут вообще три ошибки, массив локальный, разрушается после выхода, цикл бесконечный - поможет только Ctrl+Alt+Del, массив неинициализирован - AV
-----------------------
Да не стоит зацикливаться на данном примере. Конечно же это только нерабочий шаблон. Мне важно другое, - как достать оттуда результаты сформированного массива :)
← →
Anatoly Podgoretsky (2002-04-25 12:21) [4]Так приведи рабочий
← →
Digitman (2002-04-25 12:51) [5]например, вот так :
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
← →
Толик (2002-04-25 13:07) [6]>>Как из функции вернуть значения массива?
1. В ф-ю передать указатель на этот массив. После заполнения в этой ф-и массива можно обращаться к его эл-там.
Это самый простой способ, но и наиболее склонный к ошибкам, таким, как выход за границы диапазона, обращение к неинициализированной области памяти и т.д.
2. Наиболее правильное решение, на мой взгляд, оформить этот массив в виде класса, наподобие TList (кстати, чем не массив?). Всю низкоуровневую работу по проверке диапазона и всевозможной инициализации возьмёт на себя этот класс, а ф-я будет заботится только о том, чтобы передать ему правильные значения. Да и если возникнут ошибки, то их гороздо легче будет отловить, чем в первом случае.
← →
Digitman (2002-04-25 13:10) [7]>Толик
COM-сервер (читай внимательно комментарии автора ) может быть и OutOfProcess-сервером. Что на это скажешь ?
← →
Толик (2002-04-25 13:14) [8]С COM серверами ситуация та же самая: либо использовать массивы Variant (см. Digitman ©) либо написать свой класс-контейнер и вызывать его через интерфейсы.
← →
SVM (2002-04-25 13:15) [9]type
TMyArray=array of Int64;
function MyFunc:TMyArray;
begin
SetLength(Result,2);
Result[0]:=1;
Result[1]:=2;
end;
← →
Александр_30 (2002-04-26 06:04) [10]DigitMan - спасибо. После некоторых адаптаций под свои нужды все заработало. Глюков вроде пока нет :) Всем участникам - спасибо. Сюда заглядывать больше не буду. Если есть еще какие комментарии - мыльте мылом (достаточно на ник кликнуть). Отвечу всем по мере возможности :)
P.S. SVP - оригинально! Обязательно возьму на заметку. В жизни все пригодится :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c