Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Pointer-Zugriffsverletzung


Hugo343 - Sa 02.10.10 14:53
Titel: Pointer-Zugriffsverletzung
Auf dem Weg ein Snakespiel zu proggen, mit einer "Pointer-Liste" für die Linien bekomme ich einen Zugriffsfehler. Leider bin ich ein wenig verwundert da ich mich an ein älteres Projekt gehalten habe das funktionierte... (Pointer kann ich noch nich dolle). Zur Veranschaulichung aber hier besser der Quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
//(...)
type

  TDot = record
    X,Y:extended;
  end;

  PLine = ^TLine;

  TLine = class
    public
    A,B:TDot;
    Next:PLine;
    procedure SetAB(ax,ay,bx,by:extended);
  end;

  procedure LineListSetup;
  procedure LineListDestroy;
  procedure AddNewLine(ax,ay,bx,by:extended);
//(...)

var

  LineNewPointer,LineStartPointer:PLine;

implementation

procedure LineListSetup;
begin
  LineStartPointer:=NIL;
end;

procedure LineListDestroy;
begin
  LineStartPointer.Free;
  LineNewPointer.Free;
end;

procedure AddNewLine(ax,ay,bx,by:extended);
begin
  New(LineNewPointer);

// ### Bei diesen beiden Zeilen bekomme ich die Fehlermeldung
  LineNewPointer.SetAB(ax,ay,bx,by);
  LineNewPointer^.Next:=LineStartPointer;
// ###

  LineStartPointer:=LineNewPointer;
end;

//(...)

procedure TLine.SetAB(ax: Extended; ay: Extended; bx: Extended; by: Extended);
begin
  A.X:=ax;
  A.Y:=ay;
  B.X:=bx;
  B.Y:=by;
end;


Ich greife auf diese eingebundene Unit vom Projekt aus so zu:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
//(...)

procedure TForm1.Button1Click(Sender: TObject);
begin
  ax:=strtofloat(edit1.text);
  ay:=strtofloat(edit2.text);
  bx:=strtofloat(edit3.text);
  by:=strtofloat(edit4.text);

// Hier ist die Funktion:
  AddNewLine(ax,ay,bx,by);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  LineListSetup;
end;


Wär nett wenn da einer was wüsste, bin jedem dankbar.
MfG, Hugo343


Flamefire - Sa 02.10.10 14:58

du verwendest statt eines records eine Klasse. Also musst du auch eine instanz davon erstellen. Das fehlt


Delete - Sa 02.10.10 15:06

Ein Objekt einer Klasse erzeugt man mit dem Konstruktor der Klasse und nicht mit New. Desweiteren, warum sind die Prozeduren procedure LineListSetup; procedure LineListDestroy; procedure AddNewLine(ax,ay,bx,by:extended); keine Metghoden der Klasse?


Hugo343 - Sa 02.10.10 15:44

Wie genau mach ich das ich hab doch schon meine beiden Pointer (LineNewPointer,LineStartPointer:PLine;). Ich weiß das klingt total dumm aber ich hab damit ein echtes problem...


Flamefire - Sa 02.10.10 15:49

1. Entscheiden, ob es eine einfach Liste, oder eine Liste von objekten werden soll. Dein Ansatz sieht nach einer Liste ohne Objekte aus. Also: TLine als record ohne methode definieren
2. ListNewPointer sollte eine lokale Variable werden, da nur dort gebraucht.
3. Tut oder Code angucken bezüglich verketteten Listen in Delphi. Ist das einfachste ;)


Delete - Sa 02.10.10 15:56

Du machst es dir unnötig schwer. Überlege, ob du mit Records und rein prozedural arbeiten willst oder mit Klassen und Objekten.