но как-то не по Русски, может есть другие варианты?
А почему не по Русски? Ведь типы у Вас действиетльно не совпадают. 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;

← →
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 .
Пример скопирован и вставлен из приведенного выше ответа: