![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что я делаю не так?
AZIZE © (2007-08-13 14:02:00)Есть структура
rcSv=class
intPerson1:Integer;//Вершина1
intPerson2:Integer;//Вершина2
intTypeSv:Integer;//враг(-1), друг(1), неизвестно(0)
rlMoshnost:Real;//мощность связи
rlVeroyatnost:Real;//достоверность информации
rlVes:Real;//вес ребра
Procedure CopyEL(EL:rcSv);//присвоение элемента
Function Sravnenie(EL:rcSV):Boolean;//полное сравнение двух элементов (Для поиска)
Function SravnDublicate(EL:rcSv):Boolean;//сравнение для выявления множественных связей (для удаления дубликатов)
Procedure DATA(P1,P2,TS:Integer;M,V:Real);
end;
arSv=array of rcSv;
где-то далее обьявленно
Var
А:arSv;
и при
SetLength(А,N);
Выдаёт ошибку
Project MDIAPP.exe raised exeption class EAccessViolation with message 'Access violation at address 00406610 in module 'MDIAPP.exe'. Read of address 00000004'
помогите разобраться в ошибке
Игорь Шевченко (2007-08-13 15:44:00) [1]
> MDI тут абсолютно не причём, там просто есть ещё один класс
> в котором данный массив является одним из элементов, и под
> него необходимо резервировать память
Ну вот этот класс и не создан.
Рано программы писать, надо учиться, учиться и учиться, как завещал великий Ленин. А не лезет учение в голову - надо браться за метлу обеими руками и держать крепко.
Вася Правильный (2007-08-13 15:11:00) [2]
> grfVar:Graf; .... grfVar.New(100);
мдя, инициализироваться дядя Вася будет?
DVM (2007-08-13 15:11:00) [3]
> притом что мне под него нужно выделить память
кто тебе не дает? ошибка в другом месте.
Читай мои посты внимательнее - в них ответ.
AZIZE (2007-08-13 15:10:00) [4]
> Причем здесь массив?
притом что мне под него нужно выделить память
Reindeer Moss Eater (2007-08-13 15:10:00) [5]а что мне делать если я не знаю какой длины будет массив?
Надо научиться создавать экземпляры классов.
А если конкретно - то вызывать конструкторы .
DVM (2007-08-13 15:09:00) [6]
> а что мне делать если я не знаю какой длины будет массив?
Причем здесь массив?
AZIZE (2007-08-13 15:07:00) [7]
> Убери из конструктора свой сетленс и все равно получишь
> свой законно заслуженный AV .
а что мне делать если я не знаю какой длины будет массив?
Reindeer Moss Eater (2007-08-13 15:05:00) [8]Убери из конструктора свой сетленс и все равно получишь свой законно заслуженный AV .
Reindeer Moss Eater (2007-08-13 15:04:00) [9]Ну и фик ли мы упирались как не знаю кто?
grfVar:Graf;
....
grfVar.New(100);
DVM (2007-08-13 15:04:00) [10]
> procedure TForm1.Button1Click(Sender: TObject);
> Var
> grfVar:Graf;
> begin
> grfVar.New(100);
> end;
> тот же болт
Кто тебя научил этим глупостям
AZIZE (2007-08-13 15:02:00) [11]вот вызов функции
procedure TfrmRun.btnRunClick(Sender: TObject);
Var
grfVar:Graf;
rcVar:rcSv;
wrdFor:Word;
begin
grfVar.New(100);
for wrdFor := 1 to MainForm.adtSvyaz.RecordCount do
begin
MainForm.adtSvyaz.RecNo:=wrdFor;
MainForm.adtTypeSv.Locate('ID_Tip',MainForm.adtSvyazTip_Svyazi.Value,[]);
MainForm.adtIstok.Locate('ID_Istochik',MainForm.adtSvyazIstochnik.Value,[]);
rcVar.DATA(MainForm.adtSvyazPersona1.Value,MainForm.adtSvyazPersona2.Value,
MainForm.adtTypeSvPol_Otr.Value,MainForm.adtTypeSvZnachenie.Value/100,
MainForm.adtIstokDoctovernost.Value/100);
grfVar.Add(rcVar);
end;
grfVar.FindMinimum(intNumberOfP1,intNumberOfP2);
for wrdFor := 0 to grfVar.intKolichestvo - 1 do
begin
mmOut.Lines.Add(IntToStr(grfVar.MasSv[wrdFor].intPerson1));
mmOut.Lines.Add(IntToStr(grfVar.MasSv[wrdFor].intPerson2));
end;
end;
причем даже в новой проге где только
procedure TForm1.Button1Click(Sender: TObject);
Var
grfVar:Graf;
begin
grfVar.New(100);
end;
тот же болт
DVM (2007-08-13 15:00:00) [12]Да, этот кусок не содержит ошибк.
Вот прекрасно работает:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
rcSv=class
intPerson1:Integer;//Âåðøèíà1
intPerson2:Integer;//Âåðøèíà2
intTypeSv:Integer;//âðàã(-1), äðóã(1), íåèçâåñòíî(0)
rlMoshnost:Real;//ìîùíîñòü ñâÿçè
rlVeroyatnost:Real;//äîñòîâåðíîñòü èíôîðìàöèè
rlVes:Real;//âåñ ðåáðà
Procedure CopyEL(EL:rcSv);//ïðèñâîåíèå ýëåìåíòà
Function Sravnenie(EL:rcSV):Boolean;//ïîëíîå ñðàâíåíèå äâóõ ýëåìåíòîâ (Äëÿ ïîèñêà)
Function SravnDublicate(EL:rcSv):Boolean;//ñðàâíåíèå äëÿ âûÿâëåíèÿ ìíîæåñòâåííûõ ñâÿçåé (äëÿ óäàëåíèÿ äóáëèêàòîâ)
Procedure DATA(P1,P2,TS:Integer;M,V:Real);
end;
arSv=array of rcSv;
TMyClass = class
private
MasSv:arSv; //рёберный список
public
Constructor New(N:Integer);//выделение памяти под граф
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a: arSv;
m: TMyClass;
implementation
{$R *.dfm}
Constructor TMyClass.New(N:Integer);
Begin
SetLength(MasSv,N);
end;
Procedure rcSv.CopyEL(EL:rcSv);//ïðèñâîåíèå ýëåìåíòà
begin
end;
Function rcSv.Sravnenie(EL:rcSV):Boolean;//ïîëíîå ñðàâíåíèå äâóõ ýëåìåíòîâ (Äëÿ ïîèñêà)
begin
end;
Function rcSv.SravnDublicate(EL:rcSv):Boolean;//ñðàâíåíèå äëÿ âûÿâëåíèÿ ìíîæåñòâåííûõ ñâÿçåé (äëÿ óäàëåíèÿ äóáëèêàòîâ)
begin
end;
Procedure rcSv.DATA(P1,P2,TS:Integer;M,V:Real);
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
m := TMyClass.New(100);
end;
end.
Reindeer Moss Eater (2007-08-13 14:59:00) [13]Ошибка в другом месте. В приведенном коде ее нет.
AZIZE (2007-08-13 14:54:00) [14]
> Что и требовалось доказать
?
Reindeer Moss Eater (2007-08-13 14:48:00) [15]Что и требовалось доказать
AZIZE (2007-08-13 14:47:00) [16]полностью структура такая
Type
rcSv=class
intPerson1:Integer;//Вершина1
intPerson2:Integer;//Вершина2
intTypeSv:Integer;//враг(-1), друг(1), неизвестно(0)
rlMoshnost:Real;//мощность связи
rlVeroyatnost:Real;//достоверность информации
rlVes:Real;//вес ребра
Procedure CopyEL(EL:rcSv);//присвоение элемента
Function Sravnenie(EL:rcSV):Boolean;//полное сравнение двух элементов (Для поиска)
Function SravnDublicate(EL:rcSv):Boolean;//сравнение для выявления множественных связей (для удаления дубликатов)
Procedure DATA(P1,P2,TS:Integer;M,V:Real);
end;
arSv=array of rcSv;
Graf=class
MasSv:arSv; //рёберный список
intKolichestvo:Integer; //количество рёбер в рёберном списке
Constructor New(N:Integer);//выделение памяти под граф
Destructor Close;//освобождение памяти
Procedure Add(EL:rcSv);//добавление ребра к графу
Function Find(EL:rcSV):Integer;//поиск элемента в графе
Procedure Delete(N:Word);//удаление элемента по номеру
Procedure ClearDublicate;//удаление дубликатов
Procedure VesRashet;//расчет веса ребра
Procedure FindMinimum(V1,V2:Integer);//поиск минимального значения пути
Procedure FindMaximum(V1,V2:Integer);//поиск максимального значения пути
Function AllVes:Real;//расчет общего значения веса
Function SumVes:Real;//расчёт суммы всех рёбер графа
Procedure FindOfWidth(V1,V2:Integer);//поиск в ширину(минимум)
Procedure FindOfDeepMin(V1,V2:Integer);//поиск в ширину(минимум)
Procedure FindOfDeepMax(V1,V2:Integer);//поиск в ширину(максимум)
Procedure FindOfKraskal(V1,V2:Integer);//алгоритм Дейкстра(минимум)
Procedure FindSuperMin(V1,V2:Integer);//(минимум)
Procedure FindSuperMax(V1,V2:Integer);//(максимум)
Procedure PutOfOst(V1,V2:Integer);//построение пути по остовному дереву
Procedure CopyG(G:Graf);//копирование графа G
Function FindV(V:Integer):Boolean;//Поиск вершины в графе
Procedure SortMin;
Procedure SortMax;
Procedure Sceplenie(G:Graf);
Procedure CopyTO(G:Graf);//копирование в граф G
end;
процедура с ошибкой
Constructor Graf.New(N:Integer);
Begin
SetLength(MasSv,N); //ОШИБКА
intKolichestvo:=0;
end;
DVM (2007-08-13 14:45:00) [17]
> это компилируется нормально
ну тады давай тот класс в студию или хотя бы его покоцанный, но аналогично неработающий вариант.
Reindeer Moss Eater (2007-08-13 14:44:00) [18]массив - член класса?
да/нет
экземпляр класса создан?
да/нет
AZIZE (2007-08-13 14:43:00) [19]
> DVM © (13.08.07 14:34) [18]
это компилируется нормально
но в том случае который у меня-болт
причем и в другом проекте (не MDI) подключая данный модуль
Reindeer Moss Eater (2007-08-13 14:38:00) [20]MDI тут абсолютно не причём,
90 процентов, что причем.