Ein frohes neues Jahr wünsche ich euch,
ich habe mir erstaml das Videotutorial angeschaut welches mir wirklich eine Erleuchtung war. Sehr angenehm auf dieser Internetseite. Ich muss ganz ehrlich zugeben wenn man für so eine Hilfe geld zahlen müßte...ich würde es tun...großes lob auch an euch.
Ich habe die stelle an dem es um einfach verkettete Listen geht nach programmiert und glaube es auch soweit richtig zu haben. Im Prinzip läuft das Programm auch aber ich bekomme eine Fehlermeldung, welche ich erst ignorieren muss. Und zwar habe ich eine Zugriffsverletzung verursacht bei der Adresse 0453....
ich vermute das könnte vielleicht an den Hilfszeiger liegen (wrk bzw be mir work)
im ersten abschnitt erzeugen wir ein root. D.h. ein leeres Listenelement, welches als Markierer eigesetzt wird. Das Zeigerelement NEXT soll ja auf den Nachfolger zeigen aber bei root zeigt dieser ins NIL. Ist ja soweit okay. Danach fangen wir mit dem ersten Listenelement an und bezeichnen es als work- Work enthält den gleichen Inhalt wie root nur, dass work auch ein Nachfolger hat. Dann geht es los...mit der for-schleife werden die Nachfolger erzeugt. Alles soweit okay aber in der Ausgabe der Liste. definieren wir wieder einen Hilfszeiger der ach work heißt. Dieser bekommt die gleichen einstellungen wie der Markierer "root". root ist aber so zu sagen kein wirkliches Listenelement weil es keinen achfolger hat. Work ist ja das erste Listenelement. Bei der Ausgabe setzen wir work auf den Markierer. also ist worrk:=root; dann folgt eine schleife
Delphi-Quellcode:
while (work^.next<>NIL) do
begin
Memo1.Lines.append(work^.inhalt);
memo1.Lines.append(IntToStr(work^.Nummer));
work:=work^.next;
end
Das verstehe ich nicht..wenn work =
root ist und root keinen Nachfolger hat wie soll man dann überhaupt auf de Pfad work^.inhalt kommen? denn work ist zwar mit root verknüpft am Anfang aber root ncht mit work. Okay das verstehe ich nicht so ganz. Sicher wird das auch nicht der Grund der Fehlermeldung sein aber kann es bei der Zugriffsverletung an den Hilfszeiger liegen?
hier noch mal der komplette Quellcode
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Memo1: TMemo;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
TYPE T_Zeiger = ^Liste;
Liste =
Record
inhalt :
string;
Nummer :integer;
next :T_Zeiger;
end;
var
Form1: TForm1;
root :T_Zeiger;
Aktuell :T_Zeiger;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
work :T_Zeiger;
I :Integer;
begin
NEW(root);
//-------------------------Erstes Listenelement erstellen root (Kopf)
root^.next:=NIL;
//---------------du hast keinen Nachfolger
root^.inhalt:='
Root-Element';
//--root-Element enthält keine Daten
root^.Nummer:=0;
//---------------Nummer ist 0 da es nicht direkt zur Kette gehört sondern nur den Anfang markiert
work:=root;
//--------------------sagt nichts weiter aus, als das ein weiteres Element, die gleichen Inhalte trägt wie root..noch ist dieses Element nicht in der Liste
for i:=1
to 10
do
begin
New(work^.next);
//------------------------------ein neuer Speicherplatz für das neue Element wird erzeugt ..dem Nachfolger von ROOT
work:=work^.Next;
//-----------------------------auf das neu angelegte Element wechseln
work^.inhalt:='
Listenelement'+ IntToStr(i);
//---Das Neue Element bekommt ein Inhalt
work^.nummer:=i;
//------------------------------Jedes Element erhält eine Nummer
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var work:T_Zeiger;
//------------------------------Hilfszeiger
begin
work:=root;
//-----------------------------------------Hilfszeiger wird an den Anfang der Kette gesetzt
while (work^.next<>
NIL)
do //--------------------Man hangelt sich so lange durch bis der Nachfolger NIL ist
begin
Memo1.Lines.append(work^.inhalt);
memo1.Lines.append(IntToStr(work^.Nummer));
work:=work^.next;
end;
end;
end.