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

Вниз

Что я делаю не так?   Найти похожие ветки 

 
AZIZE ©   (2007-08-13 14:02) [0]

Есть структура
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"
помогите разобраться в ошибке


 
Elen ©   (2007-08-13 14:06) [1]

А создавать эти элементы массива кто будет?


 
Вася Правильный   (2007-08-13 14:08) [2]


> arSv=array of rcSv;

это че за объявление?


 
AZIZE ©   (2007-08-13 14:09) [3]


> это че за объявление?

обьявление динамического массива


 
Reindeer Moss Eater ©   (2007-08-13 14:10) [4]

и при
SetLength(А,N);
Выдаёт ошибку


Ошибка в другом месте. Не на SetLength


 
AZIZE ©   (2007-08-13 14:11) [5]


> А создавать эти элементы массива кто будет?

в смысле?
я пытаюсь выделить память под массив а элементы создавать буду позже


 
AZIZE ©   (2007-08-13 14:12) [6]


> Ошибка в другом месте. Не на SetLength

Где? при  пошаговом выполнении вылетает именно в этом месте


 
Reindeer Moss Eater ©   (2007-08-13 14:13) [7]

Где?
Сказано же в другом!

при  пошаговом выполнении вылетает именно в этом месте
Это оптический обман.


 
AZIZE ©   (2007-08-13 14:13) [8]


> Это оптический обман.

очень смешно


 
Reindeer Moss Eater ©   (2007-08-13 14:14) [9]

Смех без причины признак дурачины


 
AZIZE ©   (2007-08-13 14:15) [10]


> Смех без причины признак дурачины

ответы "лишь бы что-то написать" признак идиотизма


 
Reindeer Moss Eater ©   (2007-08-13 14:21) [11]

еще раз: ошибка в другом месте.


 
AZIZE ©   (2007-08-13 14:22) [12]


> еще раз: ошибка в другом месте.

в каком?


 
Reindeer Moss Eater ©   (2007-08-13 14:23) [13]

Ты тупой что ли?
В ДРУГОМ.

Открой справку и посмотри может ли setlength вызвать AV.


 
Reindeer Moss Eater ©   (2007-08-13 14:29) [14]

Создай новое пустое приложение, повтори декларацию массива и вызови свой сетленс. И удивись.


 
DVM ©   (2007-08-13 14:29) [15]


> в каком?

В ДНК.

1) У меня этот код работает.
2) То, что запостили сюда работать не будет в принципе, потому что А:arSv;
написано очевидно русскими буквами.


 
Reindeer Moss Eater ©   (2007-08-13 14:30) [16]

Да у него банальный косяк с неумением работать с MDI чайлдами.
Даю 90 % вероятности что это так.


 
AZIZE ©   (2007-08-13 14:32) [17]


> 2) То, что запостили сюда работать не будет в принципе,
> потому что А:arSv;
> написано очевидно русскими буквами.

тут может и русскими т.к. в проге немного подругому а приводить 700 строк кода не вижу смысла
но на D2006 код не пашет


 
DVM ©   (2007-08-13 14:34) [18]


> но на D2006 код не пашет

скопируй это в новый проект и удивись!


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;

 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 a: arSv;

implementation

{$R *.dfm}

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
 SetLength(a, 100);
end;

end.



 
AZIZE ©   (2007-08-13 14:35) [19]


> Reindeer Moss Eater ©   (13.08.07 14:30) [16]

MDI тут абсолютно не причём, там просто есть ещё один класс в котором данный массив является одним из элементов, и под него необходимо резервировать память


 
DVM ©   (2007-08-13 14:36) [20]

специально проверил на BDS2006 - все работает. Равно ка и на D7


 
Reindeer Moss Eater ©   (2007-08-13 14:38) [21]

MDI тут абсолютно не причём,

90 процентов, что причем.


 
AZIZE ©   (2007-08-13 14:43) [22]


> DVM ©   (13.08.07 14:34) [18]

это компилируется нормально
но в том случае который у меня-болт
причем и в другом проекте (не MDI) подключая данный модуль


 
Reindeer Moss Eater ©   (2007-08-13 14:44) [23]

массив - член класса?
да/нет

экземпляр класса создан?
да/нет


 
DVM ©   (2007-08-13 14:45) [24]


> это компилируется нормально

ну тады давай тот класс в студию или хотя бы его покоцанный, но аналогично неработающий вариант.


 
AZIZE ©   (2007-08-13 14:47) [25]

полностью структура такая

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;


 
Reindeer Moss Eater ©   (2007-08-13 14:48) [26]

Что и требовалось доказать


 
AZIZE ©   (2007-08-13 14:54) [27]


> Что и требовалось доказать

?


 
Reindeer Moss Eater ©   (2007-08-13 14:59) [28]

Ошибка в другом месте. В приведенном коде ее нет.


 
DVM ©   (2007-08-13 15:00) [29]

Да, этот кусок не содержит ошибк.

Вот прекрасно работает:


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.



 
AZIZE ©   (2007-08-13 15:02) [30]

вот вызов функции
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;
тот же болт


 
Reindeer Moss Eater ©   (2007-08-13 15:04) [31]

Ну и фик ли мы упирались как не знаю кто?


grfVar:Graf;
....
grfVar.New(100);


 
DVM ©   (2007-08-13 15:04) [32]


> procedure TForm1.Button1Click(Sender: TObject);
> Var
>  grfVar:Graf;
> begin
> grfVar.New(100);
> end;
> тот же болт

Кто тебя научил этим глупостям


 
Reindeer Moss Eater ©   (2007-08-13 15:05) [33]

Убери из конструктора свой сетленс и все равно получишь свой законно заслуженный AV .


 
AZIZE ©   (2007-08-13 15:07) [34]


> Убери из конструктора свой сетленс и все равно получишь
> свой законно заслуженный AV .

а что мне делать если я не знаю какой длины будет массив?


 
DVM ©   (2007-08-13 15:09) [35]


> а что мне делать если я не знаю какой длины будет массив?

Причем здесь массив?


 
Reindeer Moss Eater ©   (2007-08-13 15:10) [36]

а что мне делать если я не знаю какой длины будет массив?

Надо научиться создавать экземпляры классов.
А если конкретно - то вызывать конструкторы .


 
AZIZE ©   (2007-08-13 15:10) [37]


> Причем здесь массив?


притом что мне под него нужно выделить память


 
DVM ©   (2007-08-13 15:11) [38]


> притом что мне под него нужно выделить память

кто тебе не дает? ошибка в другом месте.

Читай мои посты внимательнее - в них ответ.


 
Вася Правильный   (2007-08-13 15:11) [39]


> grfVar:Graf; .... grfVar.New(100);

мдя, инициализироваться дядя Вася будет?


 
Игорь Шевченко ©   (2007-08-13 15:44) [40]


> MDI тут абсолютно не причём, там просто есть ещё один класс
> в котором данный массив является одним из элементов, и под
> него необходимо резервировать память


Ну вот этот класс и не создан.

Рано программы писать, надо учиться, учиться и учиться, как завещал великий Ленин. А не лезет учение в голову - надо браться за метлу обеими руками и держать крепко.



Страницы: 1 2 вся ветка

Текущий архив: 2007.09.09;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.026 c
15-1186570167
Reindeer Moss Eater
2007-08-08 14:49
2007.09.09
Эксель и счет


2-1186961034
loeg
2007-08-13 03:23
2007.09.09
HTML и Delphi


15-1186468527
TohaNik
2007-08-07 10:35
2007.09.09
Дадим стране металл!


15-1186930128
Dimka Maslov
2007-08-12 18:48
2007.09.09
Вот интересно почему


2-1187470732
Тимофей_ка
2007-08-19 00:58
2007.09.09
массив!