AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Access violation bei SetLength

Ein Thema von Stähff · begonnen am 29. Nov 2005 · letzter Beitrag vom 1. Dez 2005
Antwort Antwort
Stähff

Registriert seit: 2. Nov 2005
Ort: Chemnitz
6 Beiträge
 
Delphi 7 Enterprise
 
#1

Access violation bei SetLength

  Alt 29. Nov 2005, 12:09
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:
procedure tAutoPilot.AddPossib(const nNbr: ShortInt; const oTarget: tTarget);
 begin
  SetLength(FPossibs, nNbr); // Array dimensionieren?!

  with FPossibs[nNbr - 1] do
   begin
...als nNbr wird hier 1 übergeben, der Fehler passiert noch bevor der with-Block
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...
Miniaturansicht angehängter Grafiken
setlength-error_118.gif  
SteGra
"Probleme kann man niemals mit der gleichen Denkweise lösen durch die sie entstanden sind."Albert Einstein
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Access violation bei SetLength

  Alt 29. Nov 2005, 12:38
Schreib doch mal die Deklaration des Arrays hier rein, vielleicht ist da was nicht ganz in Ordnung.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Stähff

Registriert seit: 2. Nov 2005
Ort: Chemnitz
6 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Access violation bei SetLength

  Alt 30. Nov 2005, 15:32
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...
SteGra
"Probleme kann man niemals mit der gleichen Denkweise lösen durch die sie entstanden sind."Albert Einstein
  Mit Zitat antworten Zitat
Stähff

Registriert seit: 2. Nov 2005
Ort: Chemnitz
6 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Access violation bei SetLength

  Alt 1. Dez 2005, 18:19
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
SteGra
"Probleme kann man niemals mit der gleichen Denkweise lösen durch die sie entstanden sind."Albert Einstein
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz