AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listen und wie man sie nutzt

Ein Thema von Obelisk2k5 · begonnen am 23. Jun 2010 · letzter Beitrag vom 24. Jun 2010
Antwort Antwort
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#1

AW: Listen und wie man sie nutzt

  Alt 23. Jun 2010, 21:21
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.

Geändert von idefix2 (23. Jun 2010 um 21:26 Uhr)
  Mit Zitat antworten Zitat
Obelisk2k5

Registriert seit: 20. Jun 2010
14 Beiträge
 
Delphi 2 Desktop
 
#2

AW: Listen und wie man sie nutzt

  Alt 23. Jun 2010, 21:49
Die whileschleife hatte ich nur zu testzwecken drin.
Habe die Prozedur nun umgeschrieben und auch eine Bereichsprüfung eingebaut.

Delphi-Quellcode:
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;
Nur ist der Fehler ja ein lesefehler, d.h. der Fehler muss ein anderer sein...

Geändert von mkinzler (23. Jun 2010 um 21:50 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: Listen und wie man sie nutzt

  Alt 23. Jun 2010, 22:01
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:
In einer anderen Unit lasse ich eine for-Schleife von 1 - developersCount durchlaufen,

Geändert von idefix2 (23. Jun 2010 um 22:03 Uhr)
  Mit Zitat antworten Zitat
Obelisk2k5

Registriert seit: 20. Jun 2010
14 Beiträge
 
Delphi 2 Desktop
 
#4

AW: Listen und wie man sie nutzt

  Alt 23. Jun 2010, 22:23
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:
In einer anderen Unit lasse ich eine for-Schleife von 1 - developersCount durchlaufen,
Dann halt so.
Delphi-Quellcode:
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;
Die Funktion liefert jetzt doch garantiert den developer an [index]. Stelle in der Liste.

Jetzt habe ich noch

Delphi-Quellcode:
procedure TFrmManageDevelopers.refreshDevelopers;
var
  I : byte;
begin
LstBxDevelopers.Clear;
for I := 1 to developersCount do
  LstBxDevelopers.Items.Append(developerToStr(getDeveloperByIndex(I)));
end;
Ich sehe da kein Problem.

Und die Fehlermeldung rührt ja immernoch von einem Lesefehler her.
Ich würde nur gern wissen, wieso.

Geändert von mkinzler (24. Jun 2010 um 05:26 Uhr) Grund: Code-Tag duch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Listen und wie man sie nutzt

  Alt 23. Jun 2010, 23:00
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Obelisk2k5

Registriert seit: 20. Jun 2010
14 Beiträge
 
Delphi 2 Desktop
 
#6

AW: Listen und wie man sie nutzt

  Alt 23. Jun 2010, 23:07
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.
Die Records sind vorgegeben.

Und wo steht, das alles fertig sei?
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Listen und wie man sie nutzt

  Alt 24. Jun 2010, 00:03
Überleg einmal, was passiert, wenn es genau ein Listenelement gibt.

Dein Developerbyindex wird genau einmal mit dem Parameter index=1 aufgerufen.

if index <= DevelopersCount liefert true

for i := 0 to index-1 do -> from 0 to 0, schleife wird genau einmal durchlaufen

current := current^.Next; -> first^.next = nil, weil es ja nur ein Listenelement gibt, der next pointer des ersten Listenelemts zeigt also auf kein weiteres.

current^.content = nil^.content = exception.


Im Posting 11 habe ich Dir schon geschrieben:

Zitat:
Wenn in der Schleife beim Weiterschalten einmal nil kommt, dann war der Index zu gross, da gehört eine Fehlermeldung oder was auch immer hinein.
Wenn Du das so überprüft hättest, hättest Du den Fehler schon längst gefunden.


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.#

Geändert von mkinzler (24. Jun 2010 um 05:27 Uhr) Grund: Delphi-Tags eingefügt
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 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