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

Вниз

Глюк кодогенератора или мой?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.025 c
1-1102501731
Sirus
2004-12-08 13:28
2004.12.26
Как вставить байты в файл и как их оттуда удалить???


1-1102916467
Sicwell
2004-12-13 08:41
2004.12.26
Создать поток в DLL


1-1102352625
Bil Bal Dur
2004-12-06 20:03
2004.12.26
Структура файла MathLab


1-1103014114
Delphi5.01
2004-12-14 11:48
2004.12.26
выезжающее окошко как это сделано в WinAmp-е


14-1102221282
olookin
2004-12-05 07:34
2004.12.26
Всех люблю!!!!!!!!!