Was machen bei einer Zugriffsverletzung?



  • Hallo,

    im Rahmen meines Faches Informatiksysteme muss ich ein großes Projekt programmieren. Ich habe dazu ein Spiel gewählt. Nun bin ich in den letzten Zügen mit meinem Programm. Ich programmiere dabei in Turbo C++ Explorer 2006 von Borland.

    Doch nun zu meinem Problem: Ich bekomme seit kurzem beim Debuggen eine Zugriffsverletzung, daraufhin habe ich meine letzten Schritte rückgängig gemacht und es blieb aber die Zugriffsverletzung. Nun weis ich nicht, was machen soll um diese wieder los zu werden, kann mir jemand helfen?

    Hier nochmal die Fehlermeldung:
    http://joystickfresser.jo.ohost.de/Zugriffsfehler1.jpg
    http://joystickfresser.jo.ohost.de/Zugriffsfehler2.jpg



  • Hallo,

    Kontrolliere im Debugger wo die Zugriffsverletzung stattfindet. Schau dir den Callstack an. Kommentiere so lange Code aus bis die Zugriffsverletzung nicht mehr auftritt. Meist ist nämlich irgendwo ein fehlerhafter Arrayzugriff oder ein nich initialiesierter Pointer ganz wo anders schuld.



  • Morgen,

    der Callstack, oder auch Aufrufstack ist oben zusehen, beim 2. Link.
    Doch ich verstehe nicht was mir das sagen soll. Kannst du das mal für mich interpretieren?

    Danke bis dahin



  • Hallo

    Der Callstack sagt das die Exception im Destruktor von TFormFeld ausgelöst wird, also fang dort mit Debuggen an.

    bis bald
    akari



  • Sry fürs Doppelpost, aber es gibt eine etwas erfreuliche Nachricht. Mein Programm läuft wieder.
    Das war das Problem:

    TFormFeld *FormFeld;
    #include "FileFeldFunktionen.h"
    bool E = false;
    int SpA = FormNeu ->ADODataSetNeu ->FieldByName("Spieleranzahl") ->AsInteger; //Problem
    //---------------------------------------------------------------------------
    __fastcall TFormFeld::TFormFeld(TComponent* Owner)
    		: TForm(Owner)
    {
    }
    

    Wie ihr seht habe ich diese Variablen vor dem Programm global deklariert.
    Nach dem ich die Wertzuweisung auskommentiert habe, läuft das Prog wieder. Doch ich finde das ist nicht die Lösung des Probs, denn zum einen hatte ich diese Stelle schon länger drin und sie lief schon, kann es nicht eine Wirkung zwischen 2 Dingen sein die das Bezweckt. Außerdem ist es so das seit dem das Prog extrem langsam reagiert und es liegt nicht an meinem Rechner. Dabei erscheinen jetzt im Ereignisprotokoll "Botschaft abgeschickt" und das zuhauf. Während des Progbetriebs geht die CPU-Belastung vom Turbo C++ immer hoch und es schmiert fast ab.
    Hier mal ein Bild davon:
    http://joystickfresser.jo.ohost.de/Botschaften.jpg



  • Hallo

    Globale Variablen sind meistens schlecht, insbesondere wenn bei der Initialisierung auf andere Objekte zugegriffen werden soll die eventuell noch gar nicht angelegt wurden (wie das FormNeu). Ich bin überzeugt das in deinem Fall die Variable gar nicht global sein muß bzw. darf.

    Desweiteren können wir hier im Forum nur weiter zum Einsatz des Debuggers raten. Wir haben immer noch keinen ausreichenden Überblick über deinen Code.

    bis bald
    akari



  • Soll ich mal den ganzen Code hergeben?

    Wegen den globalen Variablen: Sollte wie sollte ich dann Funktionsübergreifende Variablen realisieren? per Übergabe/ Rückgabewerte.

    Das der Fehler kam ist jetzt nach vollziehbar doch was haben die anderen Meldungen zu sagen und warum ist das Prog so verdammt langsam geworden?

    Hier der Link zu meinem Prog als Zip: http://user.blue-cable.de/spass/TYCOON.zip



  • Sry für Doppelpost.

    Also das Problem mit der Zugriffsverletzung hab ich gelöst. Muss irgendwie an der Deklaration gelegen haben. So läuft es wieder, doch es bleibt immer noch das Problem bei dem das mein Programm langsam reagiert und dann immer im Ereignisprotokoll "Botschaft abgeschickt: hwnd =$...." (siehe Link oben) erscheint.
    Hab keine Ahnung warum das so ist, dürfte eigentlich nicht am Prog liegen sondern an irgend einer Einstellung vom Turbo C++ Explorer. Wo soll ich denn da suchen?

    Bis dahin danke.


Anmelden zum Antworten