Access Violation



  • Ich kann unmöglich den ganzen Code posten, da es ein ganzes Projekt ist.

    Ich hab die Klasse schon oft verwendet, und bisher hat sie perfekt funktioniert.

    Was ist die access violation 0xC0000005 eigentlich?

    Hier der Code der Logfile-Klasse:

    #ifndef HTML_LOG_HPP
    #define HTML_LOG_HPP
    
    // Benötigte Header
    #include <fstream> // für ofstream, string
    #include <time.h> // für time
    
    class Logfile
    {
        std::string m_filename;
    
        std::string Time(); // Gibt einen Zeit-String zurück, z.B. 12:23:34
        std::string Date(); // Gibt einen Datums-String zurück, z.B. 12.04.2005
    
        long error_counter;
    
    public:
        Logfile(std::string filename = "log.html");
        ~Logfile();
    
        // Error werden rot unterlegt, normale Messages blau
        void Log(std::string message, bool error = false);
        // Zahlen werden grün unterlegt (double dunkel, long hell)
        void Log(long lvar);
        // prec bedeutet precision (= wieviele Stellen ausgegeben werden)
        void Log(double dvar, int prec = 20);
        // Datum ausgeben
        void LogDate();
    };
    
    //////////////////////////////////////////////////////////////////////
    
    Logfile::Logfile(std::string filename)
    {
        m_filename = filename;
        error_counter = 0;
        std::ofstream logfile(m_filename.c_str(),std::ios_base::out);
        logfile << "<html>\n<head>\n<title>";
        logfile << m_filename.c_str();
        logfile << "</title>\n" << "<style type=\"text/css\">\n<!--\n";
        logfile << "td.t { background-color:#DDDD00; color:#E00000;}\n";
        logfile << "td.m { background-color:#000080;}\n";
        logfile << "td.e { background-color:#A00000;}\n";
        logfile << "td.l { background-color:#006000;}\n";
        logfile << "td.d { background-color:#004000;}\n";
        logfile << "-->\n</style>\n";
        logfile << "</head>\n";
        logfile << "<body style=\"font-size: 9pt; font-family:Verdana; background-color:#000000; color:#E0E0E0;\">\n";
        logfile << "<h1>Logfile - " << m_filename.c_str() << "</h1>\n";
        logfile << "<table width=\"100%\" style=\"font-size:9pt;\">\n";
        logfile << "<tr><td width=\"80px\"></td><td></td></tr>\n";
        logfile.close();
        Log("[LOGFILE] Start logging...",false);
        LogDate();
    }
    
    Logfile::~Logfile()
    {
        if(error_counter!=0)
        {
            Log("[LOGFILE] Errors occured!",false);
            Log("[LOGFILE] Number of Errors:",false);
            Log(error_counter); // Hier tritt der Fehler auf
    // im HTML-File steht dann statt
    // <tr><td class="t">1</td></tr>
    // diese zeile
    // <tr><td class="t">
    // und dann kommt schon der nächste Log-Eintrag.
    
    // vielleicht hilft das bei der lösung des problems.
    
        }
        else
            Log("[LOGFILE] No errors occured",false);
        LogDate();
        Log("[LOGFILE] Logging successful",false);
        std::ofstream logfile(m_filename.c_str(), std::ios_base::app);
        logfile << "</table>\n</body>\n</html>";
        logfile.close();
    }
    
    void Logfile::Log(std::string message, bool error)
    {
        std::ofstream logfile(m_filename.c_str(), std::ios_base::app);
        logfile << "<tr>";
        logfile << "<td class=\"t\"><b>";
        logfile << Time().c_str() << "</b></td><td";
        if(error)
        {
            logfile << " class=\"e\">";
            ++error_counter;
        }
        else
            logfile << " class=\"m\">";
        logfile << message.c_str();
        logfile << "</td></tr>\n";
        logfile.close();
    }
    
    void Logfile::Log(long lvar)
    {
        std::ofstream logfile(m_filename.c_str(), std::ios_base::app);
        logfile << "<tr>";
        logfile << "<td class=\"t\"><b>";
        logfile << Time().c_str() << "</b></td><td class=\"l\">";
        logfile << lvar;
        logfile << "</td></tr>\n";
        logfile.close();
    }
    
    void Logfile::Log(double dvar, int prec)
    {
        std::ofstream logfile(m_filename.c_str(), std::ios_base::app);
        logfile << "<tr>";
        logfile << "<td class=\"t\"><b>";
        logfile << Time().c_str() << "</b></td><td class=\"d\">";
        logfile.precision(prec);
        logfile << dvar;
        logfile << "</td></tr>\n";
        logfile.close();
    }
    
    void Logfile::LogDate()
    {
        std::ofstream logfile(m_filename.c_str(), std::ios_base::app);
        std::string logging("[LOGFILE] ");
        logging.append(Date());
        Log(logging);
        logfile.close();
    }
    
    std::string Logfile::Time()
    {
        time_t zeit;
        time(&zeit);
        char uhrzeit[10];
        strftime(uhrzeit,9,"%X",localtime(&zeit));
        std::string uz("[");
        uz.append(uhrzeit);
        uz.append("]");
        return uz;
    }
    
    std::string Logfile::Date()
    {
        time_t zeit;
        time(&zeit);
        char datum[12];
        strftime(datum,11,"%d.%m.%Y",localtime(&zeit));
        return std::string(datum);
    }
    
    #endif // HTML_LOG_HPP
    


  • hmm kann jetzt nix erkennen, vielleicht kannst du mit den debuger schritt für schritt durch gehen und besser erkennen wo es leigt

    ps. string kann man direkt an ostream << op übergeben ohne c_str()



  • @Dimah:
    Danke für den Tipp, statt cstr() strings zu verwenden.

    Weiß denn keiner, was das bedeutet:

    0xC0000005: Access Violation
    ?

    [ Dieser Beitrag wurde am 11.05.2003 um 10:24 Uhr von Gary editiert. ]



  • Hallo,

    Access Violation bedeutet einfach (übersetzt): Zugriffsverstoß

    D.h. du hast auf etwas zugegriffen, auf das du nicht zugreifen durftest.
    Jetzt solltest du alles mögliche in deinem Code mal weglassen, wie z.B. eine Textausgabefunktion.
    Klappt es dann ohne diese Funktion machstu sie wieder hin und gehst in sie rein.
    Dann lässt du wieder etwas in der Funktion aus, bis es klappt.
    Irgendwann haqst du den fehler dann ziemlich eingeschränkt, dann weißt du die genaue Zeile.
    Und dann kannst du dich nochmal melden. 🙂

    MfG MAV



  • Ich weiß ja schon, in welcher Zeile der Verstoß passiert:

    Logfile::~Logfile()
    {
        if(error_counter!=0)
        {
            Log("[LOGFILE] Errors occured!",false);
            Log("[LOGFILE] Number of Errors:",false);
            Log(error_counter); // Hier tritt die Zugriffsverletzung auf
        }
        else
            Log("[LOGFILE] No errors occured",false);
        LogDate();
        Log("[LOGFILE] Logging successful",false);
        std::ofstream logfile(m_filename.c_str(), std::ios_base::app);
        logfile << "</table>\n</body>\n</html>";
        logfile.close();
    }
    

    Genauer gesagt im Aufruf der Methode Log(long value) im Destruktor:

    void Logfile::Log(long lvar)
    {
        std::ofstream logfile(m_filename.c_str(), std::ios_base::app);
        logfile << "<tr>";
        logfile << "<td class=\"t\"><b>";
        logfile << Time().c_str() << "</b></td><td class=\"l\">";
    // Bis hier loggt er, dann bricht die Funktion ab
    // Aber das Programm geht einfach weiter.
        logfile << lvar;
        logfile << "</td></tr>\n";
        logfile.close();
    }
    

    Ich blick da überhaupt nicht durch 😞



  • was ist Time?

    Time().c_str() schaut nämlich _sehr_ komisch aus.



  • Original erstellt von Shade Of Mine:
    **was ist Time?

    Time().c_str() schaut nämlich _sehr_ komisch aus.**

    std::string Logfile::Time()
    {
        time_t zeit;
        time(&zeit);
        char uhrzeit[10];
        strftime(uhrzeit,9,"%X",localtime(&zeit));
        std::string uz("[");
        uz.append(uhrzeit);
        uz.append("]");
        return uz;
    }
    


  • ups, das habe ich übersehen...

    dann lass das c_str() einfach weg...



  • Zur AccessViolation: Die treten immer dann auf wenn du nicht zugreifen darfst (Speicherstelle), es aber trotzdem versuchst. Zum Auffinden kann dir nur der Debugger helfen. Meistens passiert eine AV wenn man nach dem delete noch auf einen Pointerinhalt zugreift oder wenn man Pointer nicht mit null initialisiert und demnach eine Abfrage der Art if(pSonstwas != 0) fälschlicherweise true wird. Die Funktionen AfxIsValidAddress und AfxIsMemoryBlock (beide MFC) könnten dir helfen... 😉

    EDIT: In deinem Fall oben sollte aber eigentlich keine AV stattfinden.

    [ Dieser Beitrag wurde am 12.05.2003 um 11:56 Uhr von MaSTaH editiert. ]



  • Ich denk auch nicht, dass es an meiner Klasse liegt.
    Meiner Meinung nach passiert die AV in der ofstream-Klasse.
    Aber ich habs jetzt insofern geändert, dass ich die Zahl in einen String umgewandelt habe, und dann den String logge.
    Dann funktionierts seltsamerweise 😕

    Danke nochmal an alle.


Anmelden zum Antworten