Großes Problem in header!!!



  • Vielleicht wurde auch in einer .cpp-Datei die Reihenfolge der include-Direktiven geändert...



  • wie meinst du das MFK ich vermute deine Idee ist garnicht so schlecht weil ich noch ein par neue header mit includiert habe, habe aber grad nochmal die Reihenfolge mit der älteren Version verglichen und die sind bis auf eine Header die neu dazugekommen ist gleich die neue Header ist die #include <fstream.h>



  • Wenn der Header vorher so funktioniert hat, muss vor jeder include-Direktive für die View.h eine für die Doc.h stehen. Wenn diese Reihenfolge änderst, oder in einer anderen .cpp-Datei nur die Direktive für View.h hast, kommt es zu diesem Fehler.



  • Ich habe eben grad die #include "Firststep.h" anweisung aus der cpp genommen und nur in die Header geschrieben nun bekomme ich zumindest nicht mehr im compiler/linker das Problem sonder beim Ausführen bekomme ich einen diese Fehlermeldung im Debugger:
    Nicht abgefangene Ausnahme in Firststep.exe: 0xC00000FD: Stack Overflow.

    Hier noch die Aufrufliste:

    FIRSTSTEP! 00413977()
    CWnd::OnWndMsg(unsigned int 5, unsigned int 0, long 34800276, long * 0x0012ae3c) line 1845
    CWnd::WindowProc(unsigned int 5, unsigned int 0, long 34800276) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x0135d148 {CWnd hWnd=0x000702c0}, HWND__ * 0x000702c0, unsigned int 5, unsigned int 0, long 34800276) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x000702c0, unsigned int 5, unsigned int 0, long 34800276) line 368
    AfxWndProcBase(HWND__ * 0x000702c0, unsigned int 5, unsigned int 0, long 34800276) line 220 + 21 bytes
    USER32! 77e02ca8()
    USER32! 77e04764()
    USER32! 77e04720()
    NTDLL! 778a15ef()
    USER32! 77e0c8df()
    USER32! 77e14cc1()
    CWnd::CreateDlgIndirect(const DLGTEMPLATE * 0x0041d238, CWnd * 0x00d24d78 {CWnd hWnd=0x000c012e}, HINSTANCE__ * 0x00400000) line 327 + 36 bytes
    CDialog::CreateIndirect(const DLGTEMPLATE * 0x0041d238, CWnd * 0x00d24d78 {CWnd hWnd=0x000c012e}, void * 0x00000000, HINSTANCE__ * 0x00400000) line 223
    CDialog::CreateIndirect(void * 0x0041d238, CWnd * 0x00000000 {CWnd hWnd=???}, HINSTANCE__ * 0x00400000) line 200 + 22 bytes
    CDialog::Create(const char * 0x00000086, CWnd * 0x00000000 {CWnd hWnd=???}) line 182 + 20 bytes
    CDialog::Create(unsigned int 134, CWnd * 0x00000000 {CWnd hWnd=???}) line 543 + 29 bytes
    FIRSTSTEP! 0040b22e()
    _AfxDispatchCmdMsg(CCmdTarget * 0x01150040 {CCmdTarget}, unsigned int 32773, int 0, void (void)* 0x004010fa, void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 32773, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CView::OnCmdMsg(unsigned int 32773, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 162 + 24 bytes
    CFrameWnd::OnCmdMsg(unsigned int 32773, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 894 + 33 bytes
    CWnd::OnCommand(unsigned int 32773, long 0) line 2088
    CFrameWnd::OnCommand(unsigned int 32773, long 0) line 321
    CWnd::OnWndMsg(unsigned int 273, unsigned int 32773, long 0, long * 0x0012fd10) line 1597 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 32773, long 0) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x00d24d78 {CWnd hWnd=0x000c012e}, HWND__ * 0x000c012e, unsigned int 273, unsigned int 32773, long 0) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x000c012e, unsigned int 273, unsigned int 32773, long 0) line 368
    AfxWndProcBase(HWND__ * 0x000c012e, unsigned int 273, unsigned int 32773, long 0) line 220 + 21 bytes
    USER32! 77e02ca8()
    USER32! 77e02dc5()
    USER32! 77e0577d()
    CWinThread::Run() line 487 + 11 bytes
    CWinApp::Run() line 400
    AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00133227, int 1) line 49 + 11 bytes
    FIRSTSTEP! 00413ce8()
    FIRSTSTEP! 00413bb3()
    KERNEL32! 77e787f5()
    


  • Auch wenn ichs jetzt so geändert habe das wirklich vor jeder View.h die Doc.h steht bekomme ich trotzdem noch immer den Stack Overflow.



  • Der Stapelüberlauf hat nichts mit den include-Direktiven zu tun.

    Du hast einfach irgendwo in deinem Code entweder eine Rekursion (aber danach sieht der Callstack nicht aus), oder legst irgendwo zu große Datenmengen auf dem Stack an.

    Benutzt du immer noch diese Riesenarrays? Dann leg die mal im Freispeicher an (mit new).



  • Ich rufe jetzt die Riesen arrays schon mit

    CFirststepView m_View;
    a=m_View.Blau[x][y];
    

    auf.
    Kannste mir mal bitte ein Beispiel für new geben damit habe ich leider nochnicht gearbeitet.



  • Wo (und vor allem warum) legst du bitte eine Instanz einer Viewklasse auf dem Stack an?



  • In den 3 Klassen. Wie soll ich bittesehr sonnst an die array aus den anderen 3 Klassen kommen wenn mein chef mir verbietet mit extern das zu machen.

    Würde es was bringen wenn ich nachdem ich gezeichnet habe die Instanzen wieder löschen. Wenn ja wie lösche ich die dann die Instanzen werden direckt vor der Zeichen schleife angelegt und können teoretisch nach der Zeichenschleife wieder gelöscht werden.



  • Den Unterschied zwischen Klasse und Instanz kennst du aber schon?

    Dann sollte dir klar sein, dass du dann dieses Riesenarray noch dreimal hast, und die drei haben nichts miteinander oder dem ursprünglichen Array zu tun.

    Jedenfalls:
    Instanzen von Viewklassen legt man nicht selbst an. Darum kümmert sich das Doc/View-Framework.

    Du musst in den Dialogen an die richtige Instanz der Viewklasse rankommen. Wenn es nur diese eine View gibt, reicht wahrscheinlich

    AfxGetMainWnd()->GetActiveView()
    

    Das liefert dir ein CView*, den musst du noch auf den richtigen Typ casten.



  • Abgesehen davon haben Daten in einer View nicht verloren.
    Das Widerspricht dem DOC/View.



  • Kannste mal bitte ein Beispiel dafür geben bzw wie bekomme ich den nun den Zeiger in meine Variable und wie kann ich mit hilfe von der wiederum meine array aufrufen?


Anmelden zum Antworten