Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi access violation bei arrays aus record (https://www.delphipraxis.net/8250-access-violation-bei-arrays-aus-record.html)

hugh 1. Sep 2003 00:11


access violation bei arrays aus record
 
Hallo zusammen,
bin neu hier und habe ein Problem beim Operieren mit Arrays aus einem Record; ich erhalte immer an der gleichen Stelle im Debug-Modus die Informationsmeldung "project D:\bla\bla.exe faulted with message: 'access violation at 0x0000000 read of address 0x00000000' Process stopped.",zugleich öffnet sich das CPU-Fenster. Der Record und die Arrays sehen folgendermassen aus:
Delphi-Quellcode:
implementation
type
satztyp = Record
                 Satznummer : Integer;
                 Frage, Antwort : String;
                 end;
var
k,l,m,n,jo,i0: Integer;
Level1, AbfrageArray : array[0..3] of satztyp;
   Level2  : array[0..7] of satztyp;
   Level3  : array[0..19] of TLernstoffsatztyp;
   Level4  : array[0..31] of TLernstoffsatztyp;
   Level5  : array[0..51] of TLernstoffsatztyp;
{$R *.dfm}
Soviel zur Deklaration.
Ich benutze die globalen Integers um durch die insgesamt 6 Arrays zu navigieren. Das Problem tritt in der Abfrageroutine auf und zwar immer nach der insgesamt 6. Inkrementierung von k. Hier der Codeausschnitt dazu:
Delphi-Quellcode:
 
procedure TForm1.Abfrage(Antwort: string);
var    j: Integer;
KopierArray: array[0..3] of TLernstoffsatztyp;

kopiert: Boolean;
begin
kopiert:=false;
o:=0;
if Antwort = (AbfrageArray[i0].Antwort) then
begin
  inc(Richtig);
  case AbfrageArray[i0].Satznummer of
   0: begin                            
   
   Level2[k].Frage:=AbfrageArray[i0].Frage;
   Level2[k].Antwort:=AbfrageArray[i0].Antwort;
   Level2j[k].Satznummer:=1;
   
        AbfrageArray[i0].Frage:=Leer;
        AbfrageArray[i0].Antwort:=Leer;
        AbfrageArray[i0].Satznummer:=10;
   inc(k);//im else-Zweig dieser if-Anweisung wird zurück in Level1                          //kopiert
Hab'mich auf den Code beschränkt, in dem der Fehler auftritt. Ansonsten benutze ich Memos zur Texteingabe zusammen mit einem OnKeyUp-EventHandler. Die Arrays und Integers werden im FormCreateEvent initialisiert. Wenn ich das Programm kompiliere und außerhalb von Delphi ausführe, schließt es sich an derselben Stelle wie im Debug-Modus.
Nun ich hoffe, dass einer von Euch eine Idee hat, was mein Fehler ist oder wie ich ihn weiter eingrenzen kann.
Danke im Voraus,
Gruss,
Andreas

Assarbad 1. Sep 2003 00:17

Re: access violation bei arrays aus record
 
bei einer kompletten ZIP mit den Projektdateien (Unit mit dem TForm und dem Fehler) innerhalb von 10 Minuten, würde ich mal kurz drüberschauen (ansonsten bin ich unterwegs ins Bett ;)).

In einem Forum und so wie bei dir formatiert, kann man Delphi-Code ja nicht normal lesen ;)

hugh 1. Sep 2003 00:36

Re: access violation bei arrays aus record
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
hab' gar nicht so schnell mit einer Antwort gerechnet. Das Zipfile hab' ich
angehängt, brauchte aber etwas länger, um Fehler durch 'rumprobieren wieder auszumerzen.
Muss Dich/Euch warnen, Ordnung ist nicht meine Stärke.
Der Fehler tritt auf in Datei Lernpend.pas Zeile 518, Prozedur Abfrage, die wiederum von der Prozedur LoesungMKeyup aufgerufen wird.
Gruss,
Andreas

Leuselator 1. Sep 2003 03:11

Re: access violation bei arrays aus record
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also mich wundert nicht, das Du den Durchblick verloren hast.

Bei dem Code- und VariablennamenChaos verliert man bei Code>500 Zeilen unbedingt den Durchblick.

Nicht, daß ich mich immer an die allgemein anerkannten Formatierungskonventionen halten würde, aber ich halte mich an meine eigenen, die mir Durchblick und Geschwindigkeit verschaffen.

Ich habe Zähneknirschend den Kram mal formatiert und mit ein paar Kommentaren versehen - Dein Problem löst das eventuell noch nicht ( k.A. - habe nach 1 Stunde ehrlichen Bemühens die Lust komplett verloren).
Aber vielleicht kannst Du ja etwas daraus lernen - ein paar Vorschläge findest Du im bearbeiteten Code (siehe Anhang).

"Und so hoffte er denn, wenigstens Jemanden auf den rechten Weg gebracht zu haben..."

Gruß

Assarbad 1. Sep 2003 07:40

Re: access violation bei arrays aus record
 
Liste der Anhänge anzeigen (Anzahl: 1)
War leider zu spät in der Nacht. Jetzt schau ich aber mal rein ;)

Wo ist die Funktion HolWert deklariert?

Nachtrag: Grausam, habe Leuselators Formatierungen nochmal etwas überholt (was nur heißen soll, daß sie mir nicht weit genug gingen ... O-Ton der Opposition ;)). Sollte jetzt ungefähr Borland-Style entsprechen (zumindest äußerlich). Der Code ist echter Spaghetti-Code ... quasi unwartbar. Mehrere Funktionen machen mal eben das selbe etc pp :-(

Habe für HolWert eine Fake-Func erstellt, die erstmal nur True zurückliefert. Wenn ich denn mal weiter Zeit habe, schau ich nochmal drauf.

Leuselator 1. Sep 2003 08:01

Re: access violation bei arrays aus record
 
@Assar: Die gibt es nicht mehr
Delphi-Quellcode:
function HolWert(Wert : Boolean) : Boolean;
begin
  Result := Wert;
end;
vergess ich nie :)

Assarbad 1. Sep 2003 08:10

Re: access violation bei arrays aus record
 
LOL, okay Antwort zu spät gesehen ;)

Ist doch auch mal was schönes ;) ... da wird sicher noch was drumherum gebaut ;)

hugh 1. Sep 2003 11:00

Re: access violation bei arrays aus record
 
@Leuselator
Besten Dank für Deine Tips und Aufräumarbeiten.
@alle
Werde mich nachher daran setzen, Zeit hab' ich gerade genug,
meinen Code für die Allgemeinheit lesbar zu machen.
Gruss,
Andreas

Dannyboy 1. Sep 2003 12:00

Re: access violation bei arrays aus record
 
Ganz spontan fällt mir an der Violation
Zitat:

0x0000000
auf,
dass es sich wahrscheinlich um eine BereichsUNTERschreitung handelt!
Das bedeutet, dass Du irgendwo z.B. auf das nullte Element eines Arrays
zugreifst, obwohl das Array erst bei 1 (eins) anfängt! Ich werde hier nun
eine BereichsUNTERschreitung und eine BereichsÜBERschreitung demonstrieren:


Delphi-Quellcode:
const min = 0;
      max = 5;

Var MyArray : Array[min..max] of String;

...

MyArray[min - 1] := 'Ich löse eine Violation an 0x0000000 aus!';
MyArray[max + 1] := 'Ich löse eine Violation an 0xFFFFFFF aus!';

hugh 1. Sep 2003 13:57

Re: access violation bei arrays aus record
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Leuselator
Deine Aufräumarbeiten haben den Fehler ausgemerzt. Das Komische ist, dass ich die Abfrageroutine schon 'mal in einer Konsolenanwendung getestet habe und sie einwandfrei funktionierte. Anscheinend kommt der Compiler mit meiner Unordnung auch nicht zurecht. Besten Dank nochmals,
Gruss Andreas

@alle
P.S.: Würde mich trotzdem interesieren, wie es zu so was kommt....
Hab' den lauffähigen Programmcode noch beigefügt.
Bis dann,
Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.
Seite 1 von 2  1 2      

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