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

Вниз

Динамические массивы   Найти похожие ветки 

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

Наверх




Память: 0.48 MB
Время: 0.019 c
1-74682
bambina
2002-12-13 11:18
2002.12.23
extention v saveDialog


1-74758
Спрашивающий
2002-12-15 01:36
2002.12.23
Как возвести вещественное число в степень.


1-74732
trotski
2002-12-14 08:40
2002.12.23
Не нашел в FAQ


1-74686
viper
2002-12-13 12:18
2002.12.23
Проблема с переносами!


7-75001
Сатир
2002-10-18 18:39
2002.12.23
установка переменной окружения в win2k