Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
3-25983
Alexander Vasjuk
2002-04-15 12:10
2002.05.09
Как привести NULL к нулю в SQL запросе?


1-26075
Aleksandr
2002-04-25 14:21
2002.05.09
Как убить загружающуюся DLL на этапе запуска программы?


4-26310
Shadow
2002-03-08 13:58
2002.05.09
Эмуляция нажатия клавиши


1-26100
AlexT1000
2002-04-26 17:50
2002.05.09
Печать битмапа в реальном размере..


1-26092
dnk
2002-04-26 16:25
2002.05.09
Вот проблема!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский