type
TDotName=string[2];
TDot=record
x,y: integer;
Name:TDotName;
end;
TDots=array of TDot;
TLns=record
D1,D2:TDot;
Weight:word;
end;
TLines=array of TLns;
TSubGraph=record
V:TDots;
E:TLines;
end;
var
CompSubs:array of TSubGraph; {массив компонент}
SelSubIndex:integer; {соответственно индекс}
procedure TForm1.tbCompClick(Sender: TObject); {кнопка}
begin
if Dots=nil then Exit;
FindComponents;
end;
Procedure FindComponents;
var
i,p,c,Beg:integer;
Was:array of boolean; {массив пройденных-непройденных вершин}
ans:string; {ответ для вывода}
procedure GoDepth(n:integer;var Sub: TSubGraph);
{обходом в глубину}
var
i,j,ln:integer;
a:array of integer; {номера уже включенных в массив компонент ребер}
ok:boolean;
begin
c:=c+1;
Was[n]:=true;
ok:=true;
with Sub,Form1 do
begin
SetLength(V,length(V)+1);
V[high(V)]:=dots[n]; {вершину в массив компонент}
if length(v)>1 then
for i:=n-1 downto 0 do
begin
ln:=FindLineNum(n,i); {ищу ребро инцидентное 2-м вершинам}
for j:=0 to length(a)-1 do {чтоб ребра не повторялись}
if ln=a then
ok:=false;
if (ln>=0)and(ok) then {ребро в массив компонент}
begin
setlength(a,length(a)+1);
a[high(a)]:=ln;
SetLength(E,length(E)+1);
E[high(E)]:=lns[ln];
end;
end;
end;
with Form1.Matrix2 do
for i:=0 to RowCount-1 do
if (Cells[n,i]='1')and not(Was) then
GoDepth(i,Sub);
end;
begin {FindComponents}
p:=0;
Beg:=0;
CompSubs:=nil;
SetLength(Was,length(dots));
for i:=0 to length(was) do
Was:=false;
c:=0;
SetLength(CompSubs,p+1);
GoDepth(Beg,Compsubs);
while c<length(dots) do
begin
i:=0;
while not (Was=false) do
i:=i+1;
Beg:=i;
p:=p+1;
SetLength(CompSubs,p+1);
GoDepth(Beg,Compsubs);
end;
ans:='Число компонент связности: '+inttostr(p+1);
Form1.StatusBar1.Panels[9].Text:=ans;
ShowMessage(ans+#13+'Для выделения других компонент нажмите [+], [-]');
SelSubIndex:=0;
Form1.SelectSubGraph(CompSubs[0]); {выделяет подграф}
end;
procedure TForm1.SelectSubGraph(G:TSubGraph);
var
i:integer;
begin
with G do
begin
for i:=0 to length(E)-1 do
SelectLine(E); {ну а там чисто канва}
for i:=0 to length(V)-1 do
SelectDot(V); {ну а там чисто канва}
end;
end;
Ошибка Invalid Pointer при выполнении программы
При обработке алгоритма (а точнее после) выскакивает Invalid Pointer ну и все...
...причем выскакивает при вполне определенных обстоятельствах:
1)1 или многократный вызов процедуры подряд (ну типа на кнопку щелкнуть несколько раз)
2)незнаю почему, но именно когда граф содержит 16 вершин (если <> то все работает)
Пробовал трассировать - слетает уже на выходе из обработчика - на "end". CPU показал, что слетает на @FreeMem (вроде так). Пробовал try-exceptом - нифига.
Так вот хотелось бы узнать как быть в такой ситуации и почему ошибка все-таки вылезает.
а текст проблемной цепочки такой:
Код:
Комментариев нет как класс, вложенные функции :eek:, притом что табуляция фрагментов кода даже пробелами лень сделать :( - "догадайтесь сами"
А если серьёзно, то некоторые сомнения вызывает следующий текст
"Form1.StatusBar1.Panels[9].Text:=ans;" и ему подобные
Есть два варианта:
1. Реализовать функцию как метод класса, и использовать вместо имени объекта Self - "указатель на самого себя"
2. Передавать в функцию указатель на форму, как параметр.
Вполне возможно, что при выходе из программы, функция обращается к уже удалённой форме либо пытается удалить уже удалённый объект.
Второе - вложена только GoDepth, остальное идет последовательно...
По поводу Form1 - методов класса уже столько, что я в них путаюсь, так что я сделал так, мне так удобнее и вообще это к делу не относится...
Насчет удаленного объекта, я вроде ничего не удалял (не считая nil но их вроде норма)
Есть два варианта:
1. Реализовать функцию как метод класса, и использовать вместо имени объекта Self - "указатель на самого себя"
2. Передавать в функцию указатель на форму, как параметр.
Вполне возможно, что при выходе из программы, функция обращается к уже удалённой форме либо пытается удалить уже удалённый объект.[/quote]
Все равно не дает результата, что Self, что метод класса, что параметр - все одно - Invalid Pointer. Кроме того я ведь написал, что в других случаях все работает, а вот на 1 примере слетает (може таких и больше, но я нашел один и именно 16 вершин).
Зы: могу выслать прогу с примером, если слова не убеждают...
чувак дыбани сюда:
http://jobboris007.narod.ru/graphs.rar
я вроде бы чего то написал
посмотри потести[/quote]
А ссылка рабочая?, у меня чет не грузит, Cannot download говорит
[quote=Borland_prog]чувак дыбани сюда:
я вроде бы чего то написал
посмотри потести[/quote]
А ссылка рабочая?, у меня чет не грузит, Cannot download говорит
все ровно только что протестил
ккачает как надо
только что проверила, ничего не качает. ошибка 404 - нет такой страницы. рекомендую http://rapidshare.de/ - закачка файлов до 100 мг, и скорость намного лучше чем в народе.ру.
Так что тему можно закрывать...