Thema: Delphi Pointer Problem

Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Pointer Problem

  Alt 28. Feb 2005, 15:33
Moin!

Ok, ein paar Dinge die mir aufgefallen sind:

1. Neighbour - mit u - nur als kleiner Hinweis... *g*
2. Du machst zum Anfang ein New, was den Speicher für CellWallID holt und den Zeiger darauf zeigen lässt. Ok, aber nun ist das Problem, das du diesen einen Wert mehrfach einfügen könntest. Wenn x > 0 und x > width ist, dann benutzt du TempWallID doppelt und fügst ihn auch 2x hinzu. Wenn du nun einen dieser beiden einträge rausholst und freigibst, dann ist der zweite auch gleichzeitig mit ungültig - weil du hast 2x jeweils einen zeiger auf einen speicherbereich der dann beim ersten mal rausholen freigegeben ist - aber der zweite zeiger zeigt ja immernoch drauf...
3. noch zu 2.: wenn du TempWallID Werte hinzufügst und dann TempWallID der Queue hinzufügst, dann fügst du nur einen Zeiger auf die Daten in die Queue - wenn du also danach TempWallID nochmals andere Werte änderst, dann änderst du die Werte des in der Queue befindlichen Elementes - weil beides sind Zeiger die auf einen und den gleichen Speicherplatz zeigen!
4. Du fügst einen Zeiger auf den Speicherbereich (sprich auf CellWallID) hinzu und gibst danach am Ende mit Dispose den Speicher frei. Dies ist aber schlecht, da Dispose() den mit New() angelegten Speicher für CellWallID freigibt und danach zeigt TempWallID und auch der Eintrag in der Queue auf einen Speicherbereich der freigegeben wurde - somit kracht es selbstverständlich beim Zugriff.

Mach es so:
Delphi-Quellcode:
Procedure Tmaze.NiceNeighbors(X,Y:Integer;Likes:Pointer;var CellQ:TQueue);
Var
  TempWallID : ^CellWallID;
  i : integer;
begin
  LogForm.APPEND('########Tmaze.NiceNeighbors########');
  LogForm.APPEND('.NiceNeighbors ## Hello!');

  If x>0 then
  begin
    LogForm.APPEND('.NiceNeighbors ## x>0');

    If MazeMemImg[x-1,y].Data=Likes then
    begin
      New(TempWallID);

      TempWallID^.x := x-1;
      TempWallID^.y := y;
      TempWallID^.Wall := East;
      CellQ.Push(TempWallID);

      LogForm.APPEND('.NiceNeighbors ## I like '+inttostr(x-1)+','+inttostr(y));
      LogForm.APPEND('.NiceNeighbors ## Adding to Q:');
      LogForm.APPEND('.NiceNeighbors ## X:'+inttostr(TempWallID^.x));
      LogForm.APPEND('.NiceNeighbors ## Y:'+inttostr(TempWallID^.y));
      LogForm.APPEND('.NiceNeighbors ## Wall: East');
      LogForm.APPEND('.NiceNeighbors ## CellQ.peek... ');
    end;
  end;

  If x<width then
  begin
    LogForm.APPEND('.NiceNeighbors ## x<width');

    If MazeMemImg[x+1,y].Data=Likes then
    begin
      New(TempWallID);

      TempWallID^.x:=x;
      TempWallID^.y:=y;
      TempWallID^.Wall:=East;
      CellQ.Push(TempWallID);

      LogForm.APPEND('.NiceNeighbors ## TempWallID^.x:=x;');
      LogForm.APPEND('.NiceNeighbors ## TempWallID^.y:=y;');
      LogForm.APPEND('.NiceNeighbors ## TempWallID^.Wall:=East;');
      LogForm.APPEND('.NiceNeighbors ## CellQ.Push(TempWallID);');
      LogForm.APPEND('.NiceNeighbors ## I like '+inttostr(x+1)+','+inttostr(y));
      LogForm.APPEND('.NiceNeighbors ## Adding to Q:');
      LogForm.APPEND('.NiceNeighbors ## X:'+inttostr(x));
      LogForm.APPEND('.NiceNeighbors ## Y:'+inttostr(y));
      LogForm.APPEND('.NiceNeighbors ## Wall: East');
      LogForm.APPEND('.NiceNeighbors ######');
    end;
  end;

  If y>0 then
  begin
    LogForm.APPEND('.NiceNeighbors ## y>0');

    If MazeMemImg[x,y-1].Data=Likes then
    begin
      New(TempWallID);

      TempWallID^.x := x;
      TempWallID^.y := y-1;
      TempWallID^.Wall := South;
      CellQ.Push(TempWallID);

      LogForm.APPEND('.NiceNeighbors ## I like '+inttostr(x)+','+inttostr(y-1));
      LogForm.APPEND('.NiceNeighbors ## Adding to Q:');
      LogForm.APPEND('.NiceNeighbors ## X:'+inttostr(x));
      LogForm.APPEND('.NiceNeighbors ## Y:'+inttostr(y-1));
      LogForm.APPEND('.NiceNeighbors ## Wall: South');
      LogForm.APPEND('.NiceNeighbors ######');
    end;
  end;

  If y<height then
  begin
    LogForm.APPEND('.NiceNeighbors ## y<height');

    If MazeMemImg[x,y+1].Data=Likes then
    begin
      New(TempWallID);

      TempWallID^.x := x;
      TempWallID^.y := y;
      TempWallID^.Wall := South;
      CellQ.Push(TempWallID);

      LogForm.APPEND('.NiceNeighbors ## I like '+inttostr(x)+','+inttostr(y+1));
      LogForm.APPEND('.NiceNeighbors ## Adding to Q:');
      LogForm.APPEND('.NiceNeighbors ## X:'+inttostr(x));
      LogForm.APPEND('.NiceNeighbors ## Y:'+inttostr(y));
      LogForm.APPEND('.NiceNeighbors ## Wall: South');
      LogForm.APPEND('.NiceNeighbors ######');
    end;
  end;
end;
(Rechtschreibfehler nicht korrigiert...)

/EDIT:

Das mit Peek hat nix zu sagen - der gibt dir den gleichen Zeiger zurück als wie den, den du hinzufügst...

Das Dispose() am Schluss ist das fehlerhafte - du kannst alle Peek's wieder rausschmeissen und das Dispose(), danach sollte es klappen (bzw. wie ich es nun schon gemacht habe).
Das mit dem New() in den Einzelbedingungen hast du ja nun schon nachträglich geändert.

MfG
Muetze1
  Mit Zitat antworten Zitat