Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Zeiger (https://www.delphipraxis.net/83930-problem-mit-zeiger.html)

fwsp 8. Jan 2007 18:03


Problem mit Zeiger
 
Hallo,

ich habe die folgende Prozedur, die mit Hilfe einer verketteten Liste ein neues Element hinzufügen soll. Allerdings macht er es nicht so wie ich es gerne hätte und er bricht immer ohne Fehlermeldung ab. Ich kenn mich nicht so toll mit Pointer aus, kann mir jemand vllt helfen?

Delphi-Quellcode:
procedure RQInsert(var Queue: TQueue; El: TValue; Prior: Integer);
var
  NewEl: PRQueue;
begin
  New(NewEl);
  NewEl^.Value := El;
  NewEl^.Priority := Prior;
  NewEl^.Next := Nil;
  if RQIsEmpty(Queue) then
  begin
    Queue.First := NewEl;
  end;
  Queue.Last^.Next := NewEl; // Hier wird abgebrochen
  Queue.Last := NewEl;
end;
Delphi-Quellcode:
type
  TValue = Integer;
  PRQueue = ^TRQueue;
  TRQueue = record
    Value: TValue;
    Priority: Integer;
    Next: PRQueue;
  end;
  TQueue = record
    First: PRQueue;
    Last: PRQueue;
  end;

mkinzler 8. Jan 2007 18:07

Re: Problem mit Zeiger
 
Was für ein Typ hat Queue?

fwsp 8. Jan 2007 18:11

Re: Problem mit Zeiger
 
Zitat:

Zitat von mkinzler
Was für ein Typ hat Queue?

???
die typ-deklarationen stehen doch in der Code-Box darunter.
Zitat:

Zitat von fwsp
Delphi-Quellcode:
type
  TValue = Integer;
  PRQueue = ^TRQueue;
  TRQueue = record
    Value: TValue;
    Priority: Integer;
    Next: PRQueue;
  end;
  TQueue = record
    First: PRQueue;
    Last: PRQueue;
  end;


mkinzler 8. Jan 2007 18:13

Re: Problem mit Zeiger
 
Ich meinte nicht den Typ TRQueue sondern die Variable Queue ist sie vom Typ TRQueue oder PRQueue

fwsp 8. Jan 2007 18:15

Re: Problem mit Zeiger
 
Zitat:

Zitat von mkinzler
Ich meinte nicht den Typ TRQueue sondern die Variable Queue ist sie vom Typ TRQueue oder PRQueue

weder noch, die ist vom typ TQueue, das fungiert als Sentinel.

sirius 8. Jan 2007 18:25

Re: Problem mit Zeiger
 
Auch hier kann ich nur sagen, dass es auch TList gibt :warn:

Aber zu deinem Code, so wie er da steht:

Wo tust du denn Queue.last setzen, bevor du Queue.last^ "aufrufst"?

Edit: versuch mal so
Delphi-Quellcode:
procedure RQInsert(var Queue: TQueue; El: TValue; Prior: Integer);
var
  NewEl: PRQueue;
begin
  New(NewEl);
  NewEl^.Value := El;
  NewEl^.Priority := Prior;
  NewEl^.Next := Nil;
  if RQIsEmpty(Queue) then
    Queue.First := NewEl
  else
    Queue.Last^.Next := NewEl; // Hier wird jetzt hoffentlich nicht mehr abgebrochen
  Queue.Last := NewEl;
end;

Muetze1 8. Jan 2007 18:30

Re: Problem mit Zeiger
 
Wenn nur ein Element in der Queue ist, dann ist First = Last, aber mit dem Code würde er eine AV bringen, da First in einem anderen Zweig hinzugefügt wird und somit ist Last noch Nil...

War Müll

fwsp 8. Jan 2007 18:36

Re: Problem mit Zeiger
 
Zitat:

Zitat von sirius
Wo tust du denn Queue.last setzen, bevor du Queue.last^ "aufrufst"?

bei der Initialisierung des Queues:
Delphi-Quellcode:
procedure RQEmpty(var Queue: TQueue);
begin
  Queue.First := Nil;
  Queue.Last := Queue.First;
end;
Zitat:

Zitat von sirius
Auch hier kann ich nur sagen, dass es auch TList gibt

was ich nicht verwenden darf.

//Edit
wenn ich deinen code verwende, bricht er zumindest nicht mehr ab. allerdings gibt er mir falsche werte aus, wenn ich mir das Front-Element anzeigen lassen möchte.
Wenn ich zum Beispiel den Queue damit fütter:
Delphi-Quellcode:
RQEmpty(MyQueue);
  RQInsert(MyQueue, 5, 3);
  RQInsert(MyQueue, 456, 99);
  RQInsert(MyQueue, 9, 1);
  RQInsert(MyQueue, 7, 5);
  Writeln(RQFront(MyQueue));
sollte 456 rauskommen, allerdings kommt 5 raus.

Delphi-Quellcode:
function RQFront(Queue: TQueue): TValue;
var
  HighestPrior: Integer;
begin
  if RQIsEmpty(Queue) then
  begin
    Writeln('Error: Queue is empty');
    Result := ErrorElem;
  end
  else if (Queue.First = Queue.Last) then
  begin
    Result := Queue.First.Value;
  end
  else
  begin
    HighestPrior := Queue.First.Priority;
    Result := Queue.First.Value;
    while (Queue.First <> Queue.Last) do
    begin
      Queue.First := Queue.First.Next;
      if (HighestPrior < Queue.First.Priority) then
      begin
        HighestPrior := Queue.First.Priority;
        Result := Queue.First.Value;
      end;
    end;
  end;
end;
//Edit 2
Funktioniert jetzt alles wunderbar, war ein kleiner Fehler in der Front-Prozedur.

sirius 8. Jan 2007 18:43

Re: Problem mit Zeiger
 
Zitat:

Zitat von fwsp
bei der Initialisierung des Queues:
Delphi-Quellcode:
procedure RQEmpty(var Queue: TQueue);
begin
  Queue.First := Nil;
  Queue.Last := Queue.First;
end;

Ich hoffe, das ist nur die Initialisierung und nicht, wie es aussieht, auch das Löschen der gesamten Liste (-->dispose)

Und RQIsempty liefert auch irgendwann einmal false?

fwsp 8. Jan 2007 18:46

Re: Problem mit Zeiger
 
Zitat:

Zitat von sirius
Ich hoffe, das ist nur die Initialisierung und nicht, wie es aussieht, auch das Löschen der gesamten Liste

ja, das ist nur die initialisierung, (auch alles andere wenn es nach meinem prof geht.)
Zitat:

Zitat von sirius
Und RQIsempty liefert auch irgendwann einmal false?

na klar, wenn Queue.First = Nil.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz