Текущий архив: 2002.12.26;
Скачать: CL | DM;
ВнизДинамические массивы 2 Найти похожие ветки
← →
WCM (2002-12-15 08:25) [0]Господа! Ну неужели никто не может помочь разобраться с динамическими массивами?!
Кидаю код...
unit uExpert;
interface
uses Order, Math, Windows, Forms, Arr_of_L, SysUtils, Graphics, Messages,
Classes, Controls, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Grids;
var
L_matrix : array of array of real; // матрица расстояний между НК
Radius : array of real; // массив ра между НК
n : integer; // число радиусов
cluster : array of integer; // массив числа кластеров
Clusters : array of array of integer; // матрица числа кластеров и содержащихся в них НК
Clust_R : array of array of real; // матрица радиусов и соответствующих им числа кластеров
n_clust : integer; // число кластеров
k_cel_cl : array of integer; // массив числа НК в каждом кластере
Sender : TObject; // вспомогательная переменная класса TObject для очистки экрана
num_cl : array of array of integer;
procedure ShortestPath(n_cel: integer; var Radius: array of real);
var i,j,k,l,
Xcl,Zcl: integer;
R: real;
begin
k := 0;
l := 0;
{ разворачивание Image2 до размеров экрана }
fmOrder.Image2.Transparent := True;
fmOrder.Image2.Align := alClient;
fmOrder.Image2.Canvas.Pen.Color := clBlue;
for j := 0 to n_cel-1 do
begin
{ установка большого радиуса }
R := 1.0e+12;
{ вычисление к-т следующего СВЦ }
l := l+1;
if l <> 1 then
begin
Xcl := 0; Zcl := 0;
l := 0;
for i := 1 to n_cel do
if Ship[i].Flag = True then
begin
Xcl := Xcl+Ship[i].Xt^;
Zcl := Zcl+Ship[i].Yt^;
l := l+1;
end;
end
else
begin
Xcl := Ship[j+1].Xt^;
Zcl := Ship[j+1].Yt^;
Ship[j+1].Flag := True;
k := 1;
end;
Xcl := Xcl div l;
Zcl := Zcl div l;
{ рисование СВЦ }
with fmOrder.Image2.Canvas do
begin
Pen.Color := clRed;
Ellipse(Ceil(Xcl-3),Ceil(Zcl-3),Ceil(Xcl+3),Ceil(Zcl+3));
Pen.Color := clBlue;
end;
{ расчет растояния до ближайшей точки }
for i := 1 to n_cel do
if Ship[i].Flag <> True then
begin
Order.Range(Xcl,Zcl,Ship[i].Xt^,Ship[i].Yt^);
if Length < R then
begin
R := Length;
l := i;
end;
end;
Xcl := Ship[l].Xt^;
Zcl := Ship[l].Yt^;
{ расчет растояния до ближайшей точки из уже рассмотренных }
for i := 1 to n_cel do
if Ship[i].Flag = True then
begin
Order.Range(Xcl,Zcl,Ship[i].Xt^,Ship[i].Yt^);
if Length < R then
begin
R := Length;
k := i;
end;
end;
Radius[j] := R;
{ Установка флага ближайшего НК в True }
Ship[l].Flag := True;
with fmOrder.Image2.Canvas do
begin
MoveTo(Ship[k].Xt^,Ship[k].Yt^);
LineTo(Xcl,Zcl);
end;
Application.ProcessMessages;
Sleep(300);
end;
fmOrder.Image2.Canvas.Pen.Color := clDefault;
Application.ProcessMessages;
Sleep(1000);
end;
procedure Clust(n_cel: integer);
var k,j,s,l,cl_max: integer;
R: real; // текущий радиус
X_cl,Z_cl: array of integer; // массив центров кластеров
begin
SetLength(X_cl,n_cel);
SetLength(Z_cl,n_cel);
SetLength(k_cel_cl,n_cel);
SetLength(cluster,n);
SetLength(Clust_R,n,2);
{ установка всех влагов в 0 }
Zero_FLag(n_cel);
{ вычисление кластеров }
for j := 0 to n-1 do
begin
R := Radius[j];
Forel(i,R,X_cl,Z_cl);
cluster[j] := n_clust;
Clust_R[j,0] := R;
Clust_R[j,1] := n_clust;
{ очистка экрана }
fmOrder.Button1Click(Sender);
{ установка всех влагов в 0 }
Zero_FLag(n_cel);
end;
i := n_cel;
Finalize(X_cl);
Finalize(Z_cl);
Finalize(k_cel_cl);
Finalize(cluster);
Finalize(num_cl);
Finalize(Clust_R);
Finalize(Radius); <-- Вот тут сбой!!!
end;
← →
Hooch (2002-12-15 08:46) [1]попробуй не Finalize а просто Массив := nil
← →
Alx2 (2002-12-15 09:12) [2]>WCM (15.12.02 08:25)
Этот сбой неспроста.
Дело в том, что есть разница между открытыми массивами и динамическими массивами.
Работоспособность попробуй выяснить так:
type
TDynamicArrayOfReal = array of real;
...............
procedure ShortestPath(n_cel: integer; var Radius: TDynamicArrayOfReal);
............
То есть, при передаче параметров способом, который ты привел, компилятор считает, что работает с открытым массивом Radius, а не с динамическим массивом. Чтобы устранить сумятицу, вводим тип type
TDynamicArrayOfReal = array of real;
И соответствующее передаем параметр Radius в процедуру
← →
mrcat (2002-12-15 10:00) [3]где и как Вы устанавливаете размер Radius?
Страницы: 1 вся ветка
Текущий архив: 2002.12.26;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.006 c