AW: Listen und wie man sie nutzt
So wie Du es programmiert hast, müsste der Index von 0 bis count-1 und nicht von 1 bis count laufen.
In Deiner getdeveloperbyindex Funktion fehlt jede Art von fehlerbehandlung, wenn der Index zu gross ist (wie es eben hier der Fall ist), deshalb läuft das ganze in eine Exception. Eine Schleife, bei der zu Beginn die Durchlaufzahl feststeht, wie in developerbyindex, sollte übrigens immer als for und nicht als while-Schleife realisiert werden, das trägt zum leichteren Verständnis bei. Wenn in der Schleife beim Weiterschalten einmal nil kommt, dann war der Inder zu gross, da gehört eine Fehlermeldung oder was auch immer hinein. |
AW: Listen und wie man sie nutzt
Die whileschleife hatte ich nur zu testzwecken drin.
Habe die Prozedur nun umgeschrieben und auch eine Bereichsprüfung eingebaut.
Delphi-Quellcode:
Nur ist der Fehler ja ein lesefehler, d.h. der Fehler muss ein anderer sein...
function getDeveloperByIndex(index: Cardinal): TDeveloper;
var temp : TDeveloper; i: Integer; begin current := first; if index <= DevelopersCount then for i := 0 to index do current := current^.Next; getDeveloperByIndex := current^.content; end; |
AW: Listen und wie man sie nutzt
Noch einmal: Der Index läuft von 0 bis count-1 !
Du prüfst jetzt, ob index <= Count ist. Wenn Index = Count ist, dann ist Index um 1 zu gross. Zitat:
|
AW: Listen und wie man sie nutzt
Zitat:
Delphi-Quellcode:
Die Funktion liefert jetzt doch garantiert den developer an [index]. Stelle in der Liste.
function getDeveloperByIndex(index: Cardinal): TDeveloper;
var temp : TDeveloper; i: Integer; begin current := first; if index <= DevelopersCount then for i := 0 to index-1 do current := current^.Next; getDeveloperByIndex := current^.content; end; Jetzt habe ich noch
Delphi-Quellcode:
Ich sehe da kein Problem.
procedure TFrmManageDevelopers.refreshDevelopers;
var I : byte; begin LstBxDevelopers.Clear; for I := 1 to developersCount do LstBxDevelopers.Items.Append(developerToStr(getDeveloperByIndex(I))); end; Und die Fehlermeldung rührt ja immernoch von einem Lesefehler her. Ich würde nur gern wissen, wieso. |
AW: Listen und wie man sie nutzt
Records haben im Zeitalter der OO ausgedient.
Ich würde Objekte/Klassen erstellen welche die Daten halten sollen. Mit generics würde ich dann eine TObjectList ableiten, welche die Datenobjekte aufnimmt. Wenn wie OL nun auch noch die Objekte besitzt, dann braucht man sich nicht einmal um das freigeben kümmern. ForEach wird ebenfalls unterstützt. Weitere Überlegung: Warum soviel Code schreiben, welche Fehler enthalten kann, wenn schon alles fertig ist. |
AW: Listen und wie man sie nutzt
Zitat:
Und wo steht, das alles fertig sei? |
AW: Listen und wie man sie nutzt
Überleg einmal, was passiert, wenn es genau ein Listenelement gibt.
Dein Developerbyindex wird genau einmal mit dem Parameter index=1 aufgerufen.
Delphi-Quellcode:
liefert true
if index <= DevelopersCount
Delphi-Quellcode:
-> from 0 to 0, schleife wird genau einmal durchlaufen
for i := 0 to index-1 do
Delphi-Quellcode:
-> first^.next = nil, weil es ja nur ein Listenelement gibt, der next pointer des ersten Listenelemts zeigt also auf kein weiteres.
current := current^.Next;
current^.content = nil^.content = exception. Im Posting 11 habe ich Dir schon geschrieben: Zitat:
Wenn Du das ERSTE Listenelemnt haben willst, musst Du 0 mal in der Schleife weitergehen, weil dzu Beginn zeigt Dein current ja schon auf das erste Element. Du durchläufst die Schleife prinzipiell einmal zu oft, und fliegst deswegen am Ende hinaus.# |
AW: Listen und wie man sie nutzt
Zitat:
Delphi-Quellcode:
Sollte dann ja die richtige Variante sein.
function getDeveloperByIndex(index: Cardinal): TDeveloper;
var temp : TDeveloper; i: Integer; begin current := first; if (index <= DevelopersCount) and (DevelopersCount > 1) then for i := 1 to index-1 do current := current^.Next; getDeveloperByIndex := current^.content; end; Nur tritt der von mir beschriebene Fehler immernoch auf... |
AW: Listen und wie man sie nutzt
Was spricht den gegen die Verwendung des Delphi-Tags in euren Beiträgen? Bei Delphicode sollte dieser immer verwendet weden
|
AW: Listen und wie man sie nutzt
Dir ist schon klar das die Funktion nicht das Element aus der Liste zurückgibt, sondern nur eine Kopie davon? Wird die Funktion aufgerufen wenn die Liste keine Elemente enthält, wird auf jeden Fall eine Zugriffsverletzung auftreten. Ansonsten mit dem Debugger Schritt für Schritt ausführen.
So würde ich das lösen:
Delphi-Quellcode:
Allerdings ist eine verkettete Liste für Zogriffe über einen Index wenig geeignet.
type
PDeveloper = ^TDeveloper; function getDeveloperByIndex(index: Cardinal): PDeveloper; begin current := first; while (index > 0) and Assigned(current) do begin current := current^.Next; Dec(index); end; if current <> nil then Result := @(current^.content) else Result := nil; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 Uhr. |
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