![]() |
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; |
Re: Problem mit Zeiger
Was für ein Typ hat Queue?
|
Re: Problem mit Zeiger
Zitat:
die typ-deklarationen stehen doch in der Code-Box darunter. Zitat:
|
Re: Problem mit Zeiger
Ich meinte nicht den Typ TRQueue sondern die Variable Queue ist sie vom Typ TRQueue oder PRQueue
|
Re: Problem mit Zeiger
Zitat:
|
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; |
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 |
Re: Problem mit Zeiger
Zitat:
Delphi-Quellcode:
procedure RQEmpty(var Queue: TQueue);
begin Queue.First := Nil; Queue.Last := Queue.First; end; Zitat:
//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:
sollte 456 rauskommen, allerdings kommt 5 raus.
RQEmpty(MyQueue);
RQInsert(MyQueue, 5, 3); RQInsert(MyQueue, 456, 99); RQInsert(MyQueue, 9, 1); RQInsert(MyQueue, 7, 5); Writeln(RQFront(MyQueue));
Delphi-Quellcode:
//Edit 2
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; Funktioniert jetzt alles wunderbar, war ein kleiner Fehler in der Front-Prozedur. |
Re: Problem mit Zeiger
Zitat:
Und RQIsempty liefert auch irgendwann einmal false? |
Re: Problem mit Zeiger
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz