Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
ВнизДинамические массивы Найти похожие ветки
← →
WCM (2002-12-12 02:13) [0]Господа!
Есть такая проблема.
1. При выполнении функции
Finalize(Radius);
возникает исключение.
При этом Radius - динамический массив не пустой.
2. Такая же ситуация при определении длины нового массива (с другим именем) в первый раз
SetLength(Name); - Access violation.
Подскажите, плз, как это пофиксить.
Заранее благодарен.
← →
Separator (2002-12-12 06:50) [1]
type
TAr = array of integer;
var
A: TAr;
begin
SetLength(A, 20);
A[3]:= 1;
A[6]:= 5;
Finalize(A);
end;
Все работает
← →
WCM (2002-12-14 00:38) [2]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;
← →
Anatoly Podgoretsky (2002-12-14 00:49) [3]Не видать инициализации массива Radius, зато есть обращение к неинициализированному массиву
← →
Anatoly Podgoretsky (2002-12-14 00:50) [4]Да и включи ты накоенец проверку диапазона в компиляторе, поскольку пишешь с ошбиками диапазона.
← →
WCM (2002-12-14 00:59) [5]Да инициализирую я его в другой процедуре, просто здесь приводить не стал.
Я же привел расчет... Нормально в него пишу. Просто именно при этой операции сбой происходит (при других нет) и еще, если это закоментировать сбой программы происходит при выходе (закрытии главной формы).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c