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);
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);
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!