Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глюк кодогенератора или мой?


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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо