Форум: "Начинающим";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
ВнизЧто я делаю не так? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.569 c