wxWidgets: Absturz mit "Unbehandelter Ausnahme"



  • Hi,

    weiß nicht ob das wirklich ein wxWidgets Problem, oder ganz einfach mein Unverständnis ist (ich nehme Letzteres an) ist, aber hier ist jedenfalls mein Problem:

    Ich habe eine wxPlotCtrl und mehrere Klassen. Das ganze sieht zusammengefasst in etwa so aus:

    Die eine Klasse ist:

    class ePanel:public MainPanel
    {
    public:
    void drawObj();
    
    private:
    void Onload();
    }
    

    die andere ist:

    class MainPanel:public wxPanel
    {
    protected:
    wxPlotCtrl* m_plotCtrl1;
    }
    

    In der Funktion void OnLoad::ePanel(), rufe ich eine weitere Funktion (sol)) auf (die kein Member einer Klasse ist), in dieser Funktion wiederum rufe ich dann eine Funktion auf die das PlotCtrl benutzen soll:

    void sol()
    {
    ePanel plot;
    void drawObj();
    plot.drawObj();
    }
    

    Und dann noch drawObj:

    void ePanel::drawObj()
    {
    wxGenericPen p(wxGenericColour(255,0,0),2);
    
    wxPlotMarker k;
    
    m_plotCtrl1->AddMarker(k);
    }
    

    Das ganze restliche compiled wunderbar und der Rest des Programms funktioniert auch wunderbar, solage ich die Zeile "m_plotCtrl->AddMarker(k)" auskommentiere oder den Code vondrawObj() in der ePanel::OnLoad direkt platziere.

    Sobald ich das ganze aber wie hier versuche zu implementieren, kompiliert das ganze zwar immer noch, wenn ich das Programm aber starte, krachts in der drawObj() Funktion und das Programm stürtzt mit der Fehlermeldung "Unbehandelte Ausnahme bei 0x003d873a in lep.exe: 0xC000041D: Ausnahmefehler während eines Benutzerrückrufs." ab.

    VC öffnet dann automatisch plotmark.h und verwiest dort auf eine Zeile aus der ich aber auch nicht schlau werde:

    WX_DECLARE_OBJARRAY_WITH_DECL(wxPlotMarker, wxArrayPlotMarker, class WXDLLIMPEXP_PLOTCTRL);
    

    kann mir wer helfen?

    Danke im voraus!



  • aja, in der drawObj Funktion fehlt noch eine Zeile, und zwar:

    k.CreateLineMarker(wxRect2DDouble(5,2,10,15),p);
    

    das Problem kommt aber erst mit der AddMarker Zeile.



  • Ich nehme an, du hast einen gültigen Zeiger?



  • Mechanics schrieb:

    Ich nehme an, du hast einen gültigen Zeiger?

    Nachdem du so fragst und ich nicht wüsste welchen Zeiger du meinst, fürchte ich das dem nicht so ist:-(...bzw. ein Zeiger auf was denn?



  • Ich sehe z.B. das hier:

    wxPlotCtrl* m_plotCtrl1;

    Und ich sehe, wie du darauf zugreifst:

    m_plotCtrl1->AddMarker(k);

    Aber ich sehe nicht, wo das Objekt erstellt wird bzw. herkommt.



  • Mechanics schrieb:

    Ich sehe z.B. das hier:

    wxPlotCtrl* m_plotCtrl1;

    Und ich sehe, wie du darauf zugreifst:

    m_plotCtrl1->AddMarker(k);

    Aber ich sehe nicht, wo das Objekt erstellt wird bzw. herkommt.

    Hi,

    erstmal danke für deine Hilfe!

    Ich versteh aber nicht warum ich dann aber problemlos auf wxPlotCtrl zugreifen kann, wenn ich das direkt in der Funktion OnLoad tue? Und erstellt wird es doch schon beim Start des Programms, und es ist ja auch Teil einer Klasse die sich von MainPanel ableitet?



  • Ich sehe in dem von dir geposteten Code keine andere Stelle, wo du darauf zugreifen würdest, daher die Frage.



  • Mechanics schrieb:

    Ich sehe in dem von dir geposteten Code keine andere Stelle, wo du darauf zugreifen würdest, daher die Frage.

    Hi,

    also ich fürchte ich versteh nicht ganz was du meinst 😞 Kannst dus mir vielleicht noch einmal gaaaanz langsam erklären?

    Also in dem Code den ich gepostet habe, greif ich jedenfalls nur an eine Stelle (in drawObj) auf das Objekt zu (dass es in OnLoad funktioniert war nur ganz allgemein gemeint, dort brauch ichs nämlich in diesem Fall nicht).

    Nochmal danke für deine Hilfe!



  • Ich kenne deinen Kenntnisstand nicht, daher weiß ich nicht, ob die Frage zu trivial ist. Ein Zeiger muss auf ein gültiges Objekt zeigen, z.B.

    wxPlotCtrl* m_plotCtrl1 = new wxPlotCtrl();
    

    Einfach nur die Variable zu deklarieren, reicht nicht.



  • Mechanics schrieb:

    Ich kenne deinen Kenntnisstand nicht, daher weiß ich nicht, ob die Frage zu trivial ist. Ein Zeiger muss auf ein gültiges Objekt zeigen, z.B.

    wxPlotCtrl* m_plotCtrl1 = new wxPlotCtrl();
    

    Einfach nur die Variable zu deklarieren, reicht nicht.

    Hi,

    naja meine Kenntnisstand ist jetzt nicht soooo großartig (wie man an meine Fragen ja vielleicht erahnen kann^^....allerdings brauch ich das ganze wohl auch nur einmalig, und versuche ansonsten ohne komplizierte Klassen/Objektstrukturen auszukommen, was für meine bescheidenen Zwecke eigentlich immer ausreicht), dass das Objekt zuerst erzeugt werden muss, hab ich aber eigentlich gewusst nur war ich eben verwirrt wo genau und versteh auch immer noch nicht warum ich mir das sparen kann wenn ich den Code für das Zeichnen des Graphen direkt in die OnLoad Funktion einbaue.

    Und genau an diesem Problem hänge ich jetzt, die Fehlermeldung ist zwar durch Einfügen von

    wxPlotCtrl* m_plotCtrl1 = new wxPlotCtrl();
    

    in drawObj zwar weg, aber wenn ich jetzt versuche in drawObj einen Graphen zu zeichnen, also drawObj Jetzt zB so aussieht

    void ePanel::drawObj()
    {
    wxPlotCtrl* m_plotCtrl1 = new wxPlotCtrl();
    
    wxGenericPen p(wxGenericColour(255,0,0),2);
    
    wxPlotMarker k;
    
    k.CreateLineMarker(wxRect2DDouble(1,1,8,9),p);
    
    m_plotCtrl1->AddMarker(k);
    }
    

    dann passiert gar nix, wenn ich das ganze aber direkt in OnLoad mache wird der LineMarker perfekt gezeichnet.


Anmelden zum Antworten