Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка Invalid Pointer при выполнении программы

12K
05 ноября 2006 года
ANdroid
37 / / 31.03.2006
Вобщем пишу прогу по графам, одна из задач - нахождение и выделение (на рисунке) компонент связности, для хранения компонент - динамический массив, в нем-то скорее всего и дело...
При обработке алгоритма (а точнее после) выскакивает Invalid Pointer ну и все...
...причем выскакивает при вполне определенных обстоятельствах:
1)1 или многократный вызов процедуры подряд (ну типа на кнопку щелкнуть несколько раз)
2)незнаю почему, но именно когда граф содержит 16 вершин (если <> то все работает)

Пробовал трассировать - слетает уже на выходе из обработчика - на "end". CPU показал, что слетает на @FreeMem (вроде так). Пробовал try-exceptом - нифига.

Так вот хотелось бы узнать как быть в такой ситуации и почему ошибка все-таки вылезает.

а текст проблемной цепочки такой:
Код:
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;
309
05 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
Без обид, но ошибка где-то в ДНК :)
Комментариев нет как класс, вложенные функции :eek:, притом что табуляция фрагментов кода даже пробелами лень сделать :( - "догадайтесь сами"

А если серьёзно, то некоторые сомнения вызывает следующий текст
"Form1.StatusBar1.Panels[9].Text:=ans;" и ему подобные

Есть два варианта:
1. Реализовать функцию как метод класса, и использовать вместо имени объекта Self - "указатель на самого себя"
2. Передавать в функцию указатель на форму, как параметр.

Вполне возможно, что при выходе из программы, функция обращается к уже удалённой форме либо пытается удалить уже удалённый объект.
12K
05 ноября 2006 года
ANdroid
37 / / 31.03.2006
По поводе первого - с табуляцией у меня все в порядке просто я сделал копипасте и получилось без пробелов, попробую исправить.
Второе - вложена только GoDepth, остальное идет последовательно...
По поводу Form1 - методов класса уже столько, что я в них путаюсь, так что я сделал так, мне так удобнее и вообще это к делу не относится...
Насчет удаленного объекта, я вроде ничего не удалял (не считая nil но их вроде норма)
12K
05 ноября 2006 года
ANdroid
37 / / 31.03.2006
[quote=el scorpio]
Есть два варианта:
1. Реализовать функцию как метод класса, и использовать вместо имени объекта Self - "указатель на самого себя"
2. Передавать в функцию указатель на форму, как параметр.

Вполне возможно, что при выходе из программы, функция обращается к уже удалённой форме либо пытается удалить уже удалённый объект.[/quote]

Все равно не дает результата, что Self, что метод класса, что параметр - все одно - Invalid Pointer. Кроме того я ведь написал, что в других случаях все работает, а вот на 1 примере слетает (може таких и больше, но я нашел один и именно 16 вершин).
12K
05 ноября 2006 года
ANdroid
37 / / 31.03.2006
Зы: могу выслать прогу с примером, если слова не убеждают...
1.9K
05 ноября 2006 года
Borland_prog
149 / / 25.01.2006
чувак дыбани сюда: http://jobboris007.narod.ru/graphs.rar
я вроде бы чего то написал
посмотри потести
12K
05 ноября 2006 года
ANdroid
37 / / 31.03.2006
[quote=Borland_prog]чувак дыбани сюда: http://jobboris007.narod.ru/graphs.rar
я вроде бы чего то написал
посмотри потести[/quote]
А ссылка рабочая?, у меня чет не грузит, Cannot download говорит
1.9K
05 ноября 2006 года
Borland_prog
149 / / 25.01.2006
все ровно только что протестил
1.9K
05 ноября 2006 года
Borland_prog
149 / / 25.01.2006
ккачает как надо
242
06 ноября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=Borland_prog]ккачает как надо[/quote]
только что проверила, ничего не качает. ошибка 404 - нет такой страницы. рекомендую http://rapidshare.de/ - закачка файлов до 100 мг, и скорость намного лучше чем в народе.ру.
12K
08 ноября 2006 года
ANdroid
37 / / 31.03.2006
Вобщем все, дело сделано, ошибка была очевидна, однако сбил с толку тот факт, что программа слетала в конце процедуры...
Так что тему можно закрывать...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог