Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.09;
Скачать: CL | DM;

Вниз

получение значений массива из функции   Найти похожие ветки 

 
Александр_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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
4-26314
dssfffffffffffff
2002-03-04 14:53
2002.05.09
Как програмно открыть CD


1-26111
alxx
2002-04-23 17:41
2002.05.09
Импорт библиотеки типов


1-26083
nikulin
2002-04-25 09:49
2002.05.09
Как создать кнопки похожие на системные...


3-26019
Начинающая
2002-04-16 14:07
2002.05.09
Глупый вопрос


14-26268
Olgerd
2002-03-26 17:53
2002.05.09
Эмуляция других ОС