Zugriffsverletzung wegen Zeiger



  • Hi,

    ich versuche mir ein Programm zu schreiben das An8-Dateien einliest.
    Die Klasse nennt sich An8Reader und erstellt je nach Inhalt der Datei Subklassen,
    denen dann die Daten weitergeleitet werden.
    Für den Fall das diese ungültig sind, wollte ich einen Errorstring haben, der sagt, was das Problem war.
    Dieser ist Member von der Klasse An8Reader, das heist meine Subklasse braucht einen Zeiger um ihn zu verändern.
    Das ganze sieht circa so aus:

    class An8Reader
    {
    private:
       class Block{
          public:
             Block(string name_, An8Reader *reader_);
             An8Reader *reader;
             ...
       };
       bool   errorOccured;
       string errorString;
       ...
    };
    
    //Block wird dann so initialisiert:
    An8Reader::Block::Block(string name_, An8Reader *reader_){
       name   = name_;	
       reader = reader_;
    }
    
    //und erstellen tut ihn der Reader mittels:
    ...
    new Block("main", this)
    ...
    
    //der Block kriegt nun seine Parameter und überprüft sie:
    
    void An8Reader::Block::passIdent(const string &ident){
       ...
       if(current!=4){    //zu testzwecken ist die Eingabe hier so, dass dieser Fall auftritt
          reader->errorOccured = true;
          reader->errorString = "Invalid Point Entry in Model";
          ...
    }
    

    An der Stelle wo ich errorOccured = true setze kommt dann der Error:
    "Unbehandelte Ausnahme bei 0x00b72e17 in An8_Test.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xcdcdce33."

    Was läuft da falsch?

    Mfg.



  • hast du ein AN8Reader objekt erstellt?
    also per new?



  • Das läuft atm so:

    //main() liegt natürlich nicht in der Klasse An8Reader.
    int _tmain(int argc, _TCHAR* argv[])
    {
       An8Reader a;
       a.loadAn8("dateipfad");
    }
    


  • Benutz Referenzen und verwende Elemeninitalisierer:

    class An8Reader
    {
    private:
       class Block{
          public:
             Block(string name_, An8Reader& reader_);
             An8Reader& reader;
             ...
       };
       bool   errorOccured;
       string errorString;
       ...
    };
    
    // ...
    
    //Block wird dann so initialisiert:
    An8Reader::Block::Block(string name_, An8Reader& reader_) 
        : name(name_), reader(reader_) 
    {
    }
    
    // ...
    
    void An8Reader::Block::passIdent(const string &ident){
       ...
       if(current!=4){    //zu testzwecken ist die Eingabe hier so, dass dieser Fall auftritt
          reader.errorOccured = true;
          reader.errorString = "Invalid Point Entry in Model";
          ...
    }
    

    Ansonsten kann man dir nicht wirklich weiterhelfen. Es scheint so, dass der Pointer in deinem Code ungültig ist bzw. wird.


Log in to reply