Großes Problem in header!!!
-
Hi @ all!
Kann mir einer sagen warum ich bei dem folgenden Headertext die darauf folgende Fehlermeldung bekomme:
#if !defined(AFX_FIRSTSTEPVIEW_H__4C6A5877_4440_46A1_A4AF_3B2272A16F5A__INCLUDED_) #define AFX_FIRSTSTEPVIEW_H__4C6A5877_4440_46A1_A4AF_3B2272A16F5A__INCLUDED_ #include "gruendlg.h" // Hinzugefügt von der Klassenansicht #include "blaudlg.h" // Hinzugefügt von der Klassenansicht #include "rotdlg.h" // Hinzugefügt von der Klassenansicht #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CFirststepView : public CView { protected: // Nur aus Serialisierung erzeugen DECLARE_DYNCREATE(CFirststepView) DShowLib::Grabber* m_pGrabber; // Attribute public: CFirststepDoc* GetDocument(); // Operationen public: CFirststepView(); // Überladungen // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CFirststepView) public: virtual void OnDraw(CDC* pDC); // überladen zum Zeichnen dieser Ansicht virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual void OnInitialUpdate(); //}}AFX_VIRTUAL // Implementierung public: virtual ~CFirststepView(); unsigned char Rot[PICX][PICY]; //Definition des Roten Arrays unsigned char Blau[PICX][PICY]; //Definition des Bauen Arrays unsigned char Gruen[PICX][PICY]; //Definition des Grünen Arrays #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Generierte Message-Map-Funktionen protected: //{{AFX_MSG(CFirststepView) afx_msg void OnDestroy(); afx_msg void OnMove(int x, int y); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnFileStart(); afx_msg void OnFileStop(); afx_msg void OnFileSnap(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: gruendlg m_gruendlg; blaudlg m_blaudlg; rotdlg m_rotdlg; }; #ifndef _DEBUG // Testversion in FirststepView.cpp inline CFirststepDoc* CFirststepView::GetDocument() { return (CFirststepDoc*)m_pDocument; } #endif ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein. #endif // !defined(AFX_FIRSTSTEPVIEW_H__4C6A5877_4440_46A1_A4AF_3B2272A16F5A__INCLUDED_)c:\tmp\kopie von kopie von firststep 0.3\firststepview.h(25) : error C2143: Syntaxfehler : Fehlendes ';' vor '*' c:\tmp\kopie von kopie von firststep 0.3\firststepview.h(25) : error C2501: 'CFirststepDoc' : Fehlende Speicherklasse oder Typbezeichner c:\tmp\kopie von kopie von firststep 0.3\firststepview.h(25) : error C2501: 'GetDocument' : Fehlende Speicherklasse oder Typbezeichnerund nun der Witz guckt euch den nun folgenden Headercode an der aus einer etwas älteren Version des Projekt ist:
#if !defined(AFX_FIRSTSTEPVIEW_H__4C6A5877_4440_46A1_A4AF_3B2272A16F5A__INCLUDED_) #define AFX_FIRSTSTEPVIEW_H__4C6A5877_4440_46A1_A4AF_3B2272A16F5A__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CFirststepView : public CView { protected: // Nur aus Serialisierung erzeugen CFirststepView(); DECLARE_DYNCREATE(CFirststepView) DShowLib::Grabber* m_pGrabber; // Attribute public: CFirststepDoc* GetDocument(); // Operationen public: // Überladungen // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CFirststepView) public: virtual void OnDraw(CDC* pDC); // überladen zum Zeichnen dieser Ansicht virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual void OnInitialUpdate(); //}}AFX_VIRTUAL // Implementierung public: virtual ~CFirststepView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Generierte Message-Map-Funktionen protected: //{{AFX_MSG(CFirststepView) afx_msg void OnDestroy(); afx_msg void OnMove(int x, int y); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnFileStart(); afx_msg void OnFileStop(); afx_msg void OnFileSnap(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // Testversion in FirststepView.cpp inline CFirststepDoc* CFirststepView::GetDocument() { return (CFirststepDoc*)m_pDocument; } #endif ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein. #endif // !defined(AFX_FIRSTSTEPVIEW_H__4C6A5877_4440_46A1_A4AF_3B2272A16F5A__INCLUDED_)Hier bekomme ich KEINE Fehlermeldung
-
CFirststepDoc* ist nirgends deklariert. (Hoffe ich schmeis dekla und defi nich wieder durcheinander :o( )
Zuvor wird es gegangen sein weil der Compiler eventuell zuvor einen Header gelesen hat in dem das drinn stand.
Füge am Anfang des Headers mal ein:
class CFirststepDoc;
und in der cpp in der CFirststepDoc verwendet wird [cpp]#include "CFirststepDoc.h" // wenn die Datei so heisst
-
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?