Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

получение значений массива из функции [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 и делаешь возврат функции в этот тип.
Не пробовал, но ИМХО должно пройти


Наверх

Титульная страница Поиск, карта сайта Написать письмо