Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi EAccessViolation bei privaten Variablen? Ratlos! :( (https://www.delphipraxis.net/184554-eaccessviolation-bei-privaten-variablen-ratlos.html)

sonbeta2 5. Apr 2015 15:10

EAccessViolation bei privaten Variablen? Ratlos! :(
 
Guten Tag liebe Community!

Ich muss für meine Facharbeit eine Simulation schreiben, die das Thema "Frauenversteher" umfasst.
Zunächst habe ich 3 Units. Das Formular, das Spiel, den Kandidaten. Programm: Delphi 5.

Delphi-Quellcode:
TYPE TKandidat = Class
     PRIVATE
       Nummer: Integer;
       Punkte: Integer;
     PUBLIC
       CONSTRUCTOR Create(pNummer: Integer);
       FUNCTION   GibNummer: Integer;
       FUNCTION   GibPunkte: Integer;
       PROCEDURE  Aktualisierung(pPunkte: Integer);
     END; (* TKandidat *)
Delphi-Quellcode:
TYPE TSpiel = Class
     PRIVATE
       Speicher: ARRAY[1..3] OF TKandidat;
       AnzahlKandidaten: Integer;
       Gewinnlimit: Integer;
       Frage, Antwort, Ende: Boolean;
       Runde: Integer;
     PUBLIC
       CONSTRUCTOR Create(pAnzahl, pPunkte: Integer);
       PROCEDURE Schnelldurchlauf(pKandidat, pPunkte: Integer);
       FUNCTION Ausgabe: String;
       FUNCTION Wahrscheinlichkeit(pAnzahl, pPunkte: Integer): String;
     END; (* TSpiel *)

CONSTRUCTOR TSpiel.Create(pAnzahl, pPunkte: Integer);
VAR Zaehler: Integer;
BEGIN Runde := 0;
      Ende := False;
      Gewinnlimit := pPunkte;
      AnzahlKandidaten := pAnzahl;
      //Frage := False;
      FOR Zaehler := 1 TO pAnzahl DO
       Speicher[Zaehler] := TKandidat.Create(Zaehler);
END; (* CSTR *)
Der Fehler tritt in der Unit TSpiel auf mit der Meldung:
Im Projekt ... ist eine Exception der EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse: 00441AAB in Modul ... Schreiben von Adresse 0000001C'. ...


So wird der Konstruktor etc aufgerufen:
Delphi-Quellcode:
PROCEDURE TFrauenversteher.BtStartClick(Sender: TObject);
VAR AnzKandidat, Gewinnlimit: Integer;
BEGIN AnzKandidat := StrToInt(EdKandidaten.Text);
       Gewinnlimit := StrToInt(EdPunkte.Text);
      IF (AnzKandidat < 1) OR (Gewinnlimit < 1) THEN
        LbAusgabe.Caption := 'Bitte geben Sie Daten über 0 an.'
      ELSE BEGIN
                Spiel.Create(AnzKandidat, Gewinnlimit);
           Spiel.Schnelldurchlauf(AnzKandidat, Gewinnlimit);
                // LbAusgabe.Caption := Spiel.Ausgabe
      END; (* ELSE *)
END;
Ich habe mir alles schon hunderte Male angeguckt und auch gegooglet, aber ich werde seit Stunden nicht fündig! Ich hoffe ihr könnt mir etwas behilflich sein.

MfG

Luckie 5. Apr 2015 15:20

AW: EAccessViolation bei privaten Variablen? Ratlos! :(
 
Delphi-Quellcode:
Spiel.Create(AnzKandidat, Gewinnlimit);
So habt ihr das bestimmt nicht gelernt.

ringli 5. Apr 2015 15:22

AW: EAccessViolation bei privaten Variablen? Ratlos! :(
 
Du greifst vermutlich auf einen Bereich deines Arrays Speicher zu das nicht existent ist. Wie hoch ist denn pAnzahl?

sonbeta2 5. Apr 2015 15:32

AW: EAccessViolation bei privaten Variablen? Ratlos! :(
 
@ringli:
pAnzahl ist maximal 3..

BadenPower 5. Apr 2015 15:39

AW: EAccessViolation bei privaten Variablen? Ratlos! :(
 
Schau Dir nocheinmal die Zeile an, welche Luckie beriets moniert hatte.

Zitat:

Zitat von Luckie (Beitrag 1296262)
Delphi-Quellcode:
Spiel.Create(AnzKandidat, Gewinnlimit);
So habt ihr das bestimmt nicht gelernt.

Hier findest Du den Fehler.

sonbeta2 5. Apr 2015 15:48

AW: EAccessViolation bei privaten Variablen? Ratlos! :(
 
Okay nun läuft das Programm so fehlerfrei.
Delphi-Quellcode:
 TSpiel.Create(AnzKandidat, Gewinnlimit);
//Spiel.Schnelldurchlauf(AnzKandidat, Gewinnlimit);
//LbAusgabe.Caption := Spiel.Ausgabe;
Jedoch bekomme ich bei "Spiel.Schnelldurchlauf(AnzKandidat, Gewinnlimit)" immer noch einen EAccessViolation Fehler.. Direkt in der ersten Zeile:

Delphi-Quellcode:
PROCEDURE TSpiel.Schnelldurchlauf(pKandidat, pPunkte:Integer);
VAR Zaehler, Nummer: Integer; AktKandidat: TKandidat;
BEGIN WHILE NOT Ende DO

BadenPower 5. Apr 2015 15:54

AW: EAccessViolation bei privaten Variablen? Ratlos! :(
 
Deine Variable "Spiel" ist nicht initialisiert.

Schau Dir nochmals die Zeile aus Post #2 und #5 an.

Luckie 5. Apr 2015 15:55

AW: EAccessViolation bei privaten Variablen? Ratlos! :(
 
Delphi-Quellcode:
TSpiel.Create(AnzKandidat, Gewinnlimit);
//Spiel.Schnelldurchlauf(AnzKandidat, Gewinnlimit);
Möööööp. Auch so habt ihr es nicht gelernt. Und bevor du weiter rumprobierst, werfe doch bitte mal einen Blick in ein OOP Tutorial oder Buch dazu.

DeddyH 5. Apr 2015 15:56

AW: EAccessViolation bei privaten Variablen? Ratlos! :(
 
Delphi-Quellcode:
Spiel := TSpiel.Create(AnzKandidat, Gewinnlimit);
Bei
Zitat:

Delphi-Quellcode:
Speicher[Zaehler] := TKandidat.Create(Zaehler);

machst Du es ja auch richtig, wieso nicht hier?

sonbeta2 5. Apr 2015 16:03

AW: EAccessViolation bei privaten Variablen? Ratlos! :(
 
Problem gelöst. Dankeschön an alle! Vor lauter Bäume sieht man manchmal den Wald nicht. :|

MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 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