Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1186552961
простой
2007-08-08 10:02
2007.09.09
Что с компьютером? Подскажите


8-1165410358
T54
2006-12-06 16:05
2007.09.09
image


2-1187341801
Pascal
2007-08-17 13:10
2007.09.09
Добавление автоинкрементного столбца


15-1187094594
Админостратар
2007-08-14 16:29
2007.09.09
Что-то терзает мутное сомнение...


15-1187170981
Вася Правильный
2007-08-15 13:43
2007.09.09
снова про калаш





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