Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что я делаю не так?


Страницы:   1 2

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 процентов, что причем.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо