Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизГлюк кодогенератора или мой? Найти похожие ветки
← →
Kerk © (2004-12-10 09:54) [0]
procedure QSortB(a: array of TBoundsF; l,r: integer);
var
i,j: integer;
x,y: integer;
begin
i := l; j := r;
x := a[(l+r) div 2].x;
repeat
while a[i].x < x do
inc(i);
while x < a[j].x do
dec(j);
if i <= j then
begin
y := a[i].x; a[i].x := a[j].x; a[j].x := y;
y := a[i].dl; a[i].dl := a[j].dl; a[j].dl := y;
inc(i); dec(j);
end;
until i > j;
if l < j then
QSortB(a,l,j);
if i < r then
QSortB(a,i,r);
end;
В этой процедуре содержимое дин.массива передается по значению, а не по ссылке, т.е. после выполнения процедуры его значение восстанавливается. Исследование асм-листинга показало, что она копирует массив в стек и работает с его копией. Объявление массива какprocedure QSortB(var a: array of TBoundsF; l,r: integer);
проблему решает.
В тестовом примере ничего подобного не происходит. И выводится MessageBox c числом 100.procedure TForm1.Button1Click(Sender: TObject);
type
tt = packed record x: integer; end;
ar = array of tt;
procedure a(s: ar);
begin
if s[0].x > 100 then
begin
Dec(s[0].x);
a(s);
end;
end;
var
aa: ar;
begin
SetLength(aa,1);
aa[0].x := 0987;
a(aa);
ShowMessage(IntToStr(aa[0].x));
end;
← →
Kerk © (2004-12-10 09:59) [1]На всякий случай.
type
TBoundsF = packed record
x, dl: integer;
end;
← →
VMcL © (2004-12-10 10:15) [2]>>Kerk © (10.12.04 09:54)
Первая процедура
В упор не вижу динамического массива, зато вижу Open Array.
Тестовый пример
Вот тут как раз и имеется динамический массив, который передаётся по указателю на его первый элемент.
← →
Kerk © (2004-12-10 11:12) [3]
> VMcL © (10.12.04 10:15) [2]
> >>Kerk © (10.12.04 09:54)
>
> Первая процедура
> В упор не вижу динамического массива, зато вижу Open Array.
А введение var волшебным образом превращает open array в динамический массив? Но в общем суть проблемы ясна. Спасибо.
← →
VMcL © (2004-12-10 11:36) [4]>>Kerk © (10.12.04 11:12) [3]
>А введение var волшебным образом превращает open array в динамический массив?
Нет, конечно. Превращает его в массив, передаваемый по ссылке.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.04 c