Fehlermeldung: EAccessViolation



  • Hi,

    wenn ich diesen Quelltext kompiliere, und über einen Button, ein Objekt bilde und eine Methode dieser Klasse aufrufe erhalte ich folgenden Fehler:

    "Im Projekt ist eine Exception der Klasse EAccessViolation auftetreten. Meldung: Zugriffsverletzung bei Adresse..."

    Hier der Quelltext:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "zahlenwandler.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    class Wandler
    {
    private:
            int dualValue;
            char binaryValue[8];
            char hexValue[2];
    
    public:
           void auswahl();
           char DualToBinary(dualValue);
           char DualToHex(dualValue);
           char BinaryToDual(binaryValue[8]);
           char BinaryToHex(binaryValue[8]);
           char HexToDual(hexValue[2]);
           char HexToBinary(hexValue[2]);
           Wandler();
    };
    
    //==================================== FUNKTIONEN ===========================
    //===========================================================================
    // ---------------------------------- FUNKTION: AUSWAHL ---------------------
    void Wandler::auswahl(){
    bool vorgDual = Form1->vorgDual->Checked;
    bool ergDual = Form1->vorgDual->Checked;
                            if((vorgDual == true) && (ergDual == true))
                                                         {
                                                          Form1->ergebnis->Text = Form1->vorgabe->Text;
                                                         }
                            /* !!!! TO DO: weitere Auswahlmöglichkeiten einfügen !!! */
                           }
    
    //---------------------------------- FUNKTION: DualToBinary------------------
    
    char Wandler::DualToBinary(int dualValue)
                                         {
                                         for(int i = 7; i--; i>=0)
                                                 {
                                                  if(dualValue <= 2^i)
                                                               {
                                                                dualValue = dualValue - 2^i;
                                                                binaryValue[i] = 1;
                                                               }
                                                  else binaryValue[i] = 0;
    
                                                 }
                                         return binaryValue[8];
                                         }
    
    //------------------------------------ KONSTRUKTOR --------------------------
    
    Wandler::Wandler()
                      {
    
                       dualValue = 0;
    
                       for(int i=0; i++; i<=7)
                               {
                                binaryValue[i] = 0;
                               }
    
                       for(int i=0; i++; i<=1)
                               {
                                hexValue[i] = 0;
                               }
    
                      }
    
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::wandelnClick(TObject *Sender)
    {
    
    Wandler* meinWandler = new Wandler();
    meinWandler->auswahl();
    
    }
    //---------------------------------------------------------------------------
    

    Im Quelltext weist er mich dann auf folgende Stelle hin:
    (Funktion auswahl())!

    [cpp]

    void Wandler::auswahl(){
    bool vorgDual = Form1->vorgDual->Checked;
    bool ergDual = Form1->vorgDual->Checked;
    if((vorgDual == true) && (ergDual == true))
    {
    Form1->ergebnis->Text = Form1->vorgabe->Text;
    }
    /* !!!! TO DO: weitere Auswahlmöglichkeiten einfügen !!! */
    }
    [/cpp]



  • Hallo,

    Eine AccessViolation zeigt an, dass du mit einem ungültigen Pointer arbeitest. Was ist denn Form1->vorgDual? Woher kennt deine Wandler Klasse Form1?



  • Form1 ist doch mein Fenster. vorgDual ist ein Radiobutton.

    Kann es nicht sein, dass ich mein Objekt falsch erzeuge?

    Wandler* meinWandler = new Wandler();
    

    Das ist der einzige Pointer, den ich verwende :-



  • Das sieht schon ok aus. Das hier

    return binaryValue[8];
    

    ist aber falsch. binaryValue hat ja nur 8 Elemente und du greifst auf das 9. zu.
    Warum hast du deine Wandlerklasse außerhalb von Form1 deklariert? Du greifst ja innerhalb dieser Klasse auf Objekte von Form1 zu. Diese Klasse würde ja ohne Form1 nicht funktionieren.
    Versuche mal die Klasse etwas unabhängiger zu machen.


Anmelden zum Antworten