![]() |
Access violation bei SetLength
Liste der Anhänge anzeigen (Anzahl: 1)
moinmoin,
ich hab 'n riesen Problem: beim Dimensionieren eines dynamischen Arrays tritt ununterbrochen eine 'acces violation'-Exception auf, die sich als Programmabsturz äußert bei dem das CPU-Fenster erscheint ...unglücklicherweise hab ich keinen blassen Schimmer warum dieser Fehler auftritt und wie man ihn vermeiden kann (statisches Array wäre in dieser Situation nur der allerletze Ausweg) hier einige Informationen: Bei dem zu dimensionierenden Array handelt es sich um eine Membervariable einer eigenen Klasse, deren Typ ein normales Record ist (das enthält neben einigen Standarddatentypen wiederum zwei weitere Records und ein statisches Feld... was aber aber eigentlich kein Problem sein dürfte, oder???) Die Prozedur in der der Fehler auftritt gehört zur gleichen Klasse und ist als private deklariert Als ich den SetLength-Befehl in einen try..except-Block kapselte ist der gleiche Fehler aufgetreten... betroffener Funktionsausschnitt:
Delphi-Quellcode:
...als nNbr wird hier 1 übergeben, der Fehler passiert noch bevor der with-Block
procedure tAutoPilot.AddPossib(const nNbr: ShortInt; const oTarget: tTarget);
begin SetLength(FPossibs, nNbr); // Array dimensionieren?! with FPossibs[nNbr - 1] do begin erreicht wird. Ach ja, als Attachment noch das Bild von dem, was die CPU gerade gemacht hat...?! allein komm ich hier echt nich weiter, also danke für jede antwort p.s. kann leider nicht lange online bleiben... |
Re: Access violation bei SetLength
Schreib doch mal die Deklaration des Arrays hier rein, vielleicht ist da was nicht ganz in Ordnung.
|
Re: Access violation bei SetLength
Das Ganze ist Teil eines Projekts zur Realisierung eines Tetris-Autopiloten und
deswegen etwas umfangreicher... die Klasse:
Delphi-Quellcode:
type
tAutoPilot = class(tComponent) // ... private FPossibs: array of tTarget; // Liste der möglichen Ziele // ... procedure AddPossib( const nNbr: ShortInt; const oTarget: tTarget ); // fügt der Liste ein Ziel hinzu end; Deklarationen:
Delphi-Quellcode:
// Liste, die für jede Steinart speichert, ob etwas wahr/möglich oder falsch/nicht möglich ist
tShapes = array[0..6] of Boolean; // Liste, die die vertikale Position des obersten Steins jeder Spalte speichert tColumns = array[0..DISP_WIDTH - 1] of ShortInt; // Datensatz, der alle relevanten Daten zum Relief einer Karte speichert tRelief = record nY : tColumns; // oberster Stein der der jeweiligen Spalte fAverage, // durchschnittliche Spaltenhöhe* fDepth : Real; // Summe der Abweichungen von * aller Spalten nHeight, // Anzahl der (von oben gesehen) gefüllten Reihen mit gleicher freien Spalte nGap : ShortInt; // Position der "Tetris-Spalte" bShapes : tShapes; // welche Steinform findet auf Relief Platz (ohne Lücke zu erzeugen!) bTetris : Boolean; // Tetris möglich oder nicht (unabhängig vom aktuellen Stein) end; // Datensatz, der relevante Daten zur Positionierung eines Steins speichert tBlockState = record nLeft, nTop, nRot: ShortInt; // Position und Rotationsgrad end; // Datensatz, der alle relevanten Daten eines möglichen Ziels speichert tTarget = record nEmpty : ShortInt; // entstehende Lücken nEval : array[0..5] of ShortInt; // Bewertung oState : tBlockState; // einzunehmende Position und Rotation oRelief : tRelief; // zugehöriges Relief end; ..."zur Not" könnte ich die Anzahl der Elemente auch seperat speichern, was aber nicht unbedingt der (sowieso schon recht katastrophalen) Lesbarkeit beträgt. Außerdem ist es natürlich immer besser derartige Fehler im eigenen Programmier-Stil vermeiden zu können... |
Re: Access violation bei SetLength
Es hat sich nun doch erledigt. Habe jetz einen anderen Fehler gefunden, der
allerdings ähnlich war: falsch dimensioniertes Array eines komplexen Datentyps, was wohl dazu führte, dass der Zugriff auf das genannte Feld wohl im falschen Teil des Stacks durchgeführt wurde und so (ist eigentlich auch klar) zu einer Access Violation führte, mein Fehler also... sorry for posting this shit Stähff |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz