Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-74579
cutter-pro
2002-12-04 16:24
2002.12.23
Delphi и Excel в одну постель???


14-74944
_Nicola_
2002-12-02 15:40
2002.12.23
Как получить канал передачи данных с бешеной скоростью?


1-74706
masia
2002-12-13 09:54
2002.12.23
need срочно


14-74923
JOHNY C
2002-12-02 08:20
2002.12.23
набор команды (продолжение)


1-74776
ДмитрийК.
2002-12-11 10:38
2002.12.23
Создание компонентов в runtime и перемещение их по форме





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский