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 Typbezeichner
    

    und 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?


Anmelden zum Antworten