![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк кодогенератора или мой?
Kerk © (2004-12-10 09:54:00)
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( vara: 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;
VMcL (2004-12-10 11:36:00) [1]>> Kerk © (10.12.04 11:12) [3]
> А введение var волшебным образом превращает open array в динамический массив?
Нет, конечно. Превращает его в массив, передаваемый по ссылке.
Kerk (2004-12-10 11:12:00) [2]
> VMcL © (10.12.04 10:15) [2]
> >>Kerk © (10.12.04 09:54)
>
> Первая процедура
> В упор не вижу динамического массива, зато вижу Open Array.
А введение var волшебным образом превращает open array в динамический массив? Но в общем суть проблемы ясна. Спасибо.
VMcL (2004-12-10 10:15:00) [3]>> Kerk © (10.12.04 09:54)
Первая процедура
В упор не вижу динамического массива, зато вижу Open Array.
Тестовый пример
Вот тут как раз и имеется динамический массив, который передаётся по указателю на его первый элемент.
Kerk (2004-12-10 09:59:00) [4]На всякий случай.
type
TBoundsF = packed record
x, dl: integer;
end;