Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.26;
Скачать: [xml.tar.bz2];

Вниз

Динамические массивы 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.007 c
4-86211
mba
2002-11-11 11:42
2002.12.26
TButton


4-86229
Cosmic
2002-11-10 16:49
2002.12.26
Как в консоли сделать таймер?


1-85941
tv
2002-12-17 16:44
2002.12.26
Меню автозавершения строк в Code Editor


1-85922
Jeka
2002-12-09 12:23
2002.12.26
tray


14-86135
Xfree
2002-12-06 09:54
2002.12.26
Тьрьма XXI века





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский