Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - EAccessViolation in zweidimensionalem Array
Ik4rus - Fr 13.04.12 15:01
Titel: EAccessViolation in zweidimensionalem Array
Nachdem ich es schließlich doch noch geschafft habe das Captcha zu überwinden erstmal: Hallo!
Ich hänge zzt. an einer höchst ominösen AccessViolation fest wie sie in ähnlichem Kontext wohl schon öfter Aufgetreten ist (Suchfunktion inc.), dennoch haben mir die Lösungsvorschläge der anderen Threads nicht geholfen.
Erstmal der Code:
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:
| type TTile = class private Image: TImage; wall: boolean; occupiedByParty: boolean; occupiedByEnemy: boolean; x: integer; y: integer; Top, Left, Bot, Right: TTile; tp: boolean; public procedure ChangeWallStatus; function isWall: boolean; procedure SetImage(Picture: TPicture); procedure ChangePartyOccupation; procedure ChangeEnemyOccupation; function isOccupiedbyParty: boolean; procedure SetTop(pTile: TTile); function getTop: TTile; procedure SetBot(pTile: TTile); function getBot: TTile; procedure setRight(pTile: TTile); function getRight: TTile; procedure setLeft(pTile: TTile); function getLeft: TTile; function getX: integer; function getY: integer; procedure SetTp; function isTp: boolean; procedure InitTile(Picture: TPicture; px,py: integer); end; |
Ist meine eigene Klasse TTile in der später Bilder, Koordinaten und Infos zu den Feldern eines Spieles gespeichert werden sollen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type TTileSet = class (TTile) private TileSet: Array[0..15, 0..9] of TTile; Setting: string[255]; Direction: string; public function check: TTile; procedure SaveTileToTileSet (x, y: integer; pTile: TTile); function getTileFromTileSet (x, y: integer): TTile; constructor Create (ExeDirection: string; pSetting: string; maxlvl: integer; boss: boolean); end; |
TTileSet soll die Felder, im Prinzip also das begehbare Spielfeld als solches im x*y Array TileSet speichern, der Fehler tritt jetzt im constructor auf:
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: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| constructor TTileSet.Create(ExeDirection: string; pSetting: string; maxlvl: integer; boss: boolean); var i,j,k, check, tempcount, rx, ry: integer; temp: TImage;
begin
if (pSetting= 'cave') then begin
for i := 0 to 9 do begin for j := 0 to 15 do begin
ShowMessage(ExeDirection); temp.Picture.LoadFromFile(ExeDirection + 'Sprites\Tiles\Cave\cave' + inttostr(round(random(7)+1)) + '.bmp');
TileSet[j,i]:= TTile.Create; TileSet[j,i].InitTile(temp.Picture, j, i);
if (j=0) then begin TileSet[j,i].setLeft(nil); end;
if (j>0) then begin TileSet[j-1,i].setRight(TileSet[i][j]); TileSet[j,i].setLeft(TileSet[i][j-1]); end;
if (j=15) then begin TileSet[j,i].setRight(nil); end;
if (i=0) then begin TileSet[j,i].SetTop(nil); end;
if (i>0) then begin TileSet[j,i].SetTop(TileSet[i-1][j]); TileSet[j,i-1].SetBot(TileSet[i][j]); end;
if (i=9) then begin TileSet[j,i].setBot(nil); end;
end;
end;
end;
end; |
Beim ersten Zugriff auf das Array
TileSet[j,i]:= TTile.Create; gibt es einen dicken Fehler, was ich ein bisschen seltsam finde. Ich hab jetzt schon eine Weile rumgewerkelt, komischerweise funktioniert das ganze manchmal wenn ich den gleichen Code z. B. vor die Schleife stelle, allerdings kommt dann direkt die nächste AccessViolation an der nächsten Stelle an der auf TileSet zugegriffen wird. Irgendwas muss da also nicht richtig initialisiert sein, oder?
Schonmal Danke im Vorraus!
Gausi - Fr 13.04.12 15:09
Hallo und :welcome: in der Entwickler-Ecke?
Wie sieht es denn mit dem temp-Image aus? Hast du den Code, der das erzeugt, nur hier weggelassen, oder fehlt der wirklich? Ein Image muss nämlich auch erzeugt werden. Wobei an der Stelle vermutlich ein TBitmap auch ausreichen würde. ;-)
Ik4rus - Fr 13.04.12 16:41
Hey, danke für die schnelle Antwort!
Hm, ich hab das tatsächlich nicht extra erzeugt. Ich hab das ganze jetzt ergänzt um
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| constructor TTileSet.Create(ExeDirection: string; pSetting: string; maxlvl: integer; boss: boolean); var i,j,k, check, tempcount, rx, ry: integer; temp: TImage;
begin
temp:= TImage.Create(temp);
if (pSetting= 'cave') then... begin |
und sicherheitshalber
Delphi-Quelltext
1: 2: 3: 4:
| constructor TTile.Create; begin self.Image:= TImage.Create(Image); end; |
Jetzt kommt die AccessViolation schon bei
temp:= TImage.Create(temp);. Wie kann es denn sein, dass mein Konstruktor keine Zugriffrechte auf seine eigenen Variablen hat?
es sollte eigentlich schon ein Image sein, für den Fall, dass ich später noch mit Canvas rumfummeln will :)
bummi - Fr 13.04.12 17:11
Du erzeugst im ersten Fall mit einer nicht initialisierten Stackvariable als Owner.
Die Idee an sich, wie sie denn ginge, wäre böse.
Die Idee des Create(Aowner:TComponet) ist dass das Bild vom Owner freigegeben würde bei der Freigabe des Owners, wenn die Komponeten ihr eigener Owner wäre und sich bei der Freigabe freigeben würde .freigeben würde .freigeben würde.freigeben würde.freigeben würde.freigeben würde.freigeben würde.
Delphi-Quelltext
1:
| temp:= TImage.Create(nil); |
BTW, alles was erzeugt wird muß irgendwo wieder freigegeben werden und wie bereits erwähnt würde TBitmap genügen, hier gibt es auch keinen Owner.
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!