Delphi функция возвращающая массив

но как-то не по Русски, может есть другие варианты?

А почему не по Русски? Ведь типы у Вас действиетльно не совпадают. a:ArrayOfInteger и a:array of Integer — это не одно и тоже.

type RPRec = ^RRec;arrayOfRPRec = array of RPRec;RRec = record end;T >arrayOfRPRec ; public procedure getNextArray1(var AArray : arrayOfRPRec ); function getNextArray2() : arrayOfRPRec; end;procedure T >arrayOfRPRec ); begin AArray := self.FArrays[0]; end;function T >

Если объявил тип arrayofRPRec, то и использую его кругом:

Если функция возвращает динамический массив в качестве результат — создается ли его копия в памяти — или мы получаем ссылку на тот же массив? Т.е. ведет ли себя в этом случае динамический массив как string (я так понял — это близнецы-браться в Дельфи)?
Спасибо!


umbra © ( 2005-10-20 09:59 ) [1]

не совсем понятно, о чем речь. Копия чего создается (или нет) в памяти?


TUser © ( 2005-10-20 10:01 ) [2]

Если ты внутри функции сделал SetLength (result,125), то в этот момент создается его экземпляр в памяти (нужной длины), но он не уничтожается после завершения работы ф-ции. Наоборот, ссылка на этот экземпляр возвращается твоей функцией.


begin. end © ( 2005-10-20 10:03 ) [3]

> Jolik © (20.10.05 09:11)

> создается ли его копия в памяти

> или мы получаем ссылку на тот же массив?

Просто на единицу увеличивается счётчик ссылок массива — поэтому он и не финализируется автоматически перед выходом из подпрограммы.


GuAV © ( 2005-10-21 12:29 ) [4]


> Просто на единицу увеличивается счётчик ссылок массива
> — поэтому он и не финализируется автоматически перед
> выходом из подпрограммы.

Нет, не поэтому, а потому что не предпринимается никаких попыток финализировать его там.

Читайте также:  Бытовые швейные машины бывают с каким приводом

Функция, возвращающая динамический массив эквивалентна процедуре имеющей дин. массив в качестве var параметра. Т.е. дин массив инициализируется и финализируется в вызывающей, а не в вызываемой подпрограмме.


evvcom © ( 2005-10-21 13:00 ) [5]

И как это в функции результат может инициализироваться в вызывающей программе? Я про случай, когда функция возвращает не ссылку на уже существующий массив (приватное поле или глобальная переменная), а когда делается именно в этой функции SetLength(Result, Value);


begin. end © ( 2005-10-24 08:44 ) [6]

> GuAV © (21.10.05 12:29) [4]

> Функция, возвращающая динамический массив эквивалентна процедуре
> имеющей дин. массив в качестве var параметра.

Это понятно, но я говорил про случай, когда внутри функции есть локальная переменная динамического массива, и её значение присваивается Result"у. Посмотри на вопрос — если имелось в виду не это, то причём тут тогда копия в памяти? По-моему, вопрос был как раз в том, будет ли при таком присваивании копирование массива или нет.

> не предпринимается никаких попыток финализировать его там

type
TStrArray = array of string;

function GetArray: TStrArray;
var
A: TStrArray;
begin
SetLength(A, 1);
A[0] := "abcdef";
Result := A;
Dec(PInteger(Cardinal(A) — 8)^)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(GetArray[0])
end

Скомпилируй, запусти, удивись 🙂


Anatoly Podgoretsky © ( 2005-10-24 08:54 ) [7]

Автор не говорит точно об функции, что у него именно и как он работает с этим. Отсюда два толкования. Если строго следовать вопросу, то ни о каких локальных переменных и присвоении их результату и речи быть не должно.


Anatoly Podgoretsky © ( 2005-10-24 09:03 ) [8]

function Foo: TArrayType;
begin
BlackBox;
end;

Читайте также:  Arctic cooling freezer 33 esports one


GuAV © ( 2005-10-24 22:45 ) [9]


> Скомпилируй, запусти, удивись 🙂

Нашел чем удивить 🙂
Результат не финализируется, финализируется переменная A.

Т.к. обе переменные ссылаются на один и тот же массив, правка счётчика ссылок приводит к тому что финализация предпоследней, а не последней переменной приводит к удалению массива из памяти.

Т.е., для массива как для структуры в памяти счётчик ссылок может менятся, однако массив как переменная (т.е. параметр Result) не финализируется и не инициализируется в вызываемой подпрограмме.

Я подумал, что ты говоришь про переменную, потому, что термин "финализация" применим к именно переменной, а не к структуре в памяти.


TButton © ( 2005-10-25 02:55 ) [10]

по сабжу
если мне нужно, чтоб функция вернула динамический массив
я переделываю её в процедуру
например

type
tMyArray = array of tSomeThing
.
procedure ReturnValues(var arr: tMyArray);
begin
SetLength(arr.
end;

это позволяет создать массив во внешней процедуре (функции)
передать его для наполнения/обработки
и уничтожить не знадумываясь
о том, куда девается память


begin. end © ( 2005-10-25 08:24 ) [11]

> GuAV © (24.10.05 22:45) [9]

Ну, как переменная он может быть и не финализируется, но тело массива-результата в примере [6] освобождается. Если вручную не уменьшать счётчик, то не освободится, и именно потому, что счётчик больше нуля. Про такой случай я и говорил в [3].

У меня есть функция в моем приложении, которая должна возвращать массив. Я нашел в нескольких местах, как это сделать, объявив тип массива, например.

И затем объявив мою функцию

Моя проблема заключается в том, чтобы установить это в форме, которая имеет как интерфейс, так и реализацию. Как объявить мой тип и объявить функцию с этим типом в интерфейсе?

Читайте также:  Усилители сигнала интернет связи дачи

Золотое правило заключается в том, что раздел интерфейса устройства описывает типы данных, используемые устройством, а также типы, классы и функции (их подписи), которые находятся в модуле. Это то, что видят все остальные единицы. Раздел реализации содержит реализацию классов и функций. Это не видно единицам ohter. Другие устройства должны заботиться о интерфейсе устройства, "контракте", подписанном данным устройством, и внешнем блоке, а не "деталях реализации", найденных в разделе реализации.

Если вы Delphi довольно недавно, вам не нужно объявлять новый тип, объявив его как TArray .

Пример скопирован и вставлен из приведенного выше ответа: