Großes Problem in header!!!
-
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?