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
Obelisk2k5

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

AW: Listen und wie man sie nutzt

  Alt 23. Jun 2010, 21:01
Ich habe jetzt einen anderen Fehler.

Und zwar bekomme ich die Fehlermeldung
Zitat:
Im Projekt [Name] ist eine Exception der Klasse EAccessViolation mit der Meldung
'Zugriffsverletzung bei Adresse 004C2DDA in Modul '[Name]'.
Lesen von Adresse 00000000 aufgetreten.
Code:
Delphi-Quellcode:
type
  TListe = ^TElement;
  TElement = record
               content : TDeveloper;
               Next : TListe;
             end;

var
  First : TListe = nil;
  Last : TListe = nil;
  Current : TListe;
  Allocations : integer = 0;

function newDeveloper(person: TPerson; description: TDescription) : boolean;
var
  RunPointer : TListe;
  I: byte;
  Temp_ID: Integer;
begin
  if developersCount < DEVELOPER_MAX then
  begin
  // ---- Temporäre ID -------------------------------------------------------
  Temp_ID := DEVELOPER_ID_MIN;
  //- Wenn es schon andere Developer gibt, wird die Temporäre ID inkrementiert,
  //-- bis sie einen Wert hat, der noch nicht als Developer ID vergeben ist --
  if developersCount > 0 then
    begin
    for I := DEVELOPER_MIN to DEVELOPER_MAX do
      begin
      Runpointer := first;
      While RunPointer <> nil do
        begin
        if Runpointer^.content.developerID = Temp_ID then inc(Temp_ID);
        Runpointer := Runpointer^.Next;
        end;
      end;
    end;
  new (Current);
  inc(Allocations);
  Current.content.developerID := Temp_ID;
  Current.content.developerPerson := person;
  Current.content.developerDescription := description;
  Current.Next := nil;
  if last = nil then
    begin
    First := Current;
    Last := Current;
    end
    else
     begin
     Last.Next := Current;
     Last := Current;
     end;
  newDeveloper := true;
  end
  else newDeveloper := false;
end;

function developersCount: Integer;
var
  i : integer;
begin
  i := 0;
  current := first;
  while current <> nil do
    begin
    inc(i);
    current := current^.Next;
    end;
  developersCount := i;
end;

function getDeveloperByIndex(index: Cardinal): TDeveloper;
var
  temp : TDeveloper;
  i: Integer;
begin
  i := 0;
  current := first;
  while i <> index do
  begin
    inc(i);
    current := current^.Next;
  end;
  getDeveloperByIndex := current^.content; // <<====== Hier tritt der Fehler auf.
end;
Ich füge mit NewDeveloper einen developer hinzu.
In einer anderen Unit lasse ich eine for-Schleife von 1 - developersCount durchlaufen,
bei dem ich den developer mit dem Index I durch getDeveloperbyIndex auslesen lasse und
einige Werte in einer listbox anzeigen lasse.

Die obigen Codeteile sind die einzigen, die ich verändert habe (vorher lief alles über Arrays),
von der anderen Unit sollte der Fehler nicht kommen.

Geändert von Obelisk2k5 (23. Jun 2010 um 21:25 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
 
#2

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

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

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

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

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

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
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#8

AW: Listen und wie man sie nutzt

  Alt 24. Jun 2010, 10:00
Sorry, war nicht am Ende des Threads ....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.667 Beiträge
 
Delphi 12 Athens
 
#9

AW: Listen und wie man sie nutzt

  Alt 24. Jun 2010, 10:02
Sicher, beim letzten Element der Liste wird es das. Aber er fragt genau dies ja im Anschluss ab.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 07:04 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