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

Вниз

Если функция возвращает динамический массив...   Найти похожие ветки 

 
Jolik ©   (2005-10-20 09:11) [0]

Если функция возвращает динамический массив в качестве результат - создается ли его копия в памяти - или мы получаем ссылку на тот же массив? Т.е. ведет ли себя в этом случае динамический массив как 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].



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
4-1126693655
Still Swamp
2005-09-14 14:27
2005.11.13
Надо в CallBack API функции передать метод TObject


14-1129720995
Digitman
2005-10-19 15:23
2005.11.13
doc/xls/rtf <-> xml/xsl


14-1129816780
CrazyDog
2005-10-20 17:59
2005.11.13
64 bit поддержка в Delphi


2-1129442715
serg128
2005-10-16 10:05
2005.11.13
Как заменить первую маленькую букву на большую?


2-1129620068
Id
2005-10-18 11:21
2005.11.13
Работа с базами FB