Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehlerfinden "verkette Liste"-AccountDaten


IhopeonlyReader - Do 09.05.13 19:22
Titel: Fehlerfinden "verkette Liste"-AccountDaten
Ich habe eine Verkette Liste erstellt, als Inhalt hat es ein Record names RAccount...
mir gelingt es nicht die "account loeschen" procedure zu erstellen..
der fehler liegt beim setzten des neuen Endes !
Ende := pointer^.before;
zeigt inkompatible typen obwohl sowohl before, als auch Ende vom Typ ^TSpeicher sind..
Ende := @(pointer^.before^);
lässt zwar das kompilieren zu, gibt aber danach (beim neuen acc-erstellen oder sonst wo) fehler aus !

ich habe die Unit + Test-projekt angehängt...
wäre nett wenn ihr es euch mal anschaut und den Fehler nennt... (ja ich habe nicht die "Standart-Begriffe" verwendet, und ob es eine "richtige" verkette Liste ist, weiß ich auch nicht...
Wie gesagt bin selbst-beibringer und daher bin ich manchmal sehr gewöhnungsbedürftig in meiner programmierart


Narses - Do 09.05.13 23:17

Moin!

Nur damit ich sicher bin, dich richtig verstanden zu haben:Hab ich was übersehen? :gruebel:

cu
Narses

//EDIT: Ich bin mal nicht so ;) Suchen liefert sowas hier:
http://www.entwickler-ecke.de/viewtopic.php?p=650275#650275
Kannst auch mal nach Suche in: Delphi-Forum, Delphi-Library LINEARE LISTE suchen. :idea:


IhopeonlyReader - Fr 10.05.13 00:34

ja :) nur ich arbeite auch mit einem Zeiger nach hinten!

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
TKnoten = class
  before: ^TKnoten;
  next: TKnoten;
  Inhalt: RDaten;
end;

Dann habe ich eine Unit erstellt mit folgenden Proceduren/Funktionen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
      constructor Create; overload;
      constructor Create(const Benutzername, Passwort: String); overload;
      procedure Erweitere(const Benutzername, Passwort: String);
      function vorhanden(const Benutzername: String): Boolean;
      function Finde(const Benutzername: String): PAccount;
      function loesche(const Benutzername: String): Boolean;
      destructor loeschen;
      //  - - - - - - - - - - - - - -  Zusatzfunktionen  - - - - - - - - - - - - - - -
      function AenderePasswort(const Benutzername, NeuesPasswort: String): Boolean;
      function Kontrolliere: Boolean;


der Fehler liegt in der function loesche(const Benutzername: String): Boolean; bei dem Punkt
Ende := Ende^.before; //funktioniert nicht
also so geschrieben:
Ende := @Ende^.before^;

es funktioniert zwar, aber es gibt nun fehler! (zugriffsverletzung)

Zur Vereinfachung habe ich anstatt nur den Quelltext der Unit zu zeigen direkt ein Testprogramm mitgeliefert, dass alle Funktionen einzeln testet!


mandras - Fr 10.05.13 01:20

user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
es funktioniert zwar, aber es gibt nun fehler! (zugriffsverletzung)

Ah ja.

Ich lese hier fleißig, antworte aber nur manchmal.
Was mir hier fehlt ist eine mit vernünftigen Aufwand nachvollziehbare Fehlerbeschreibung.

Moderiert von user profile iconNarses: Zitat mit Tags garniert.


Narses - Fr 10.05.13 01:50

Moin!

Mal generell: Objekt-Variablen sind bereits Pointer, du kannst also den Dereferenzierungsoperator (das Caret) weglassen! :idea:

cu
Narses


Tranx - Fr 10.05.13 04:36

Warum verarbeitest Du die Liste nicht in dem Objekt, das dafür zuständig ist: TList.

Die einzelnen Einträge der TList (Zeiger) sind dann Objekte Deines Typs. Dann sollte das wandern innerhalb der Liste, das Löschen einzelner Einträge oder gar der gesamten Liste nicht schwer sein. Und Du benötigst für das einzelne Objekt nicht die Eigenschaften "before" und "next", die zudem unlogisch sind, denn ein Objekt einer beliebigen Liste hat nun mal keinen einmal definierten und damit festgelegten Vorgänger und Nachfolger, weil durch Einfügen und Löschen diese sich jederzeit ändern können. Also macht es keinen Sinn, die Einträge auf der Objektebene zu definieren. Bei meinen Objekten (Analysenergebnisse von Materialanalysen) klappt diese Vorgehensweise hervorragend. Ich habe nie Probleme mit Zugriffsverletzungen. Und in diesem Fall ist ein Objekt sogar zweischichtig:

Analysengrunddaten (Auftragsnummer, Datum, Messprogramm ...)
Zusammensetzung (Element, Konzentration, Sollwerte, ...)

Die Daten werden aus Datenbanken in die Liste gelesen und dort nach Bearbeitung wieder abgespeichert.

Die Vorgehensweise mit TList solltest Du mal überlegen.


Narses - Fr 10.05.13 13:16

Moin!

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Warum verarbeitest Du die Liste nicht in dem Objekt, das dafür zuständig ist: TList.
Weil es u.U. nicht die Aufgabe ist? :nixweiss: Eine TList (und wenn schon, dann für Objekte eine TObjectList :zwinker:) ist nun mal ein Array, eine lineare Liste ist aber konzeptionell etwas ganz anderes. Das sollte man (zumindest für den akademischen Zweck) nicht ausser acht lassen. :idea:


user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
nur ich arbeite auch mit einem Zeiger nach hinten!
Dann such halt nach "doppelt verketteter Liste". ;) Gibt sicher auch was zu. :les:

cu
Narses


Blup - Fr 10.05.13 14:28

Ich hab mal bischen drin rumgedoktert, mit ein par Anmerkungen.


IhopeonlyReader - Sa 11.05.13 16:17

Danke :)
Es ist natürlich jetzt auch logisch, warum es einen Fehler gibt ! einen zeiger auf einen zeiger ist nicht gut ...