Fehler beim Kompilieren



  • Hallo, Leute. Da bin ich wieder und weil ich Anfänger in
    C++ bin, brauche ich wieder Ihre Hilfe.Ich gehe jetzt
    einen Tutorial für Visual C++.6 durch, ich habe aber
    Visual Studio.Net 2003. Und hier gibt es einige
    Unterschiede. Es geht um ein Grafik-Programm.
    Ein SDI-Anwendung. Es soll etwas gezeichnet werden.
    Und dann gespeichert.Und dann wieder gezeigt.
    Also, ich habe eine neue Klasse CLine erstellt.
    In Tag10_1Doc.h habe ich einen Funktion
    AddLine(CPoint ptFrom, CPoint ptTo) eingefügt
    mit Funktionstyp CLine* und mit gleichem
    Funktionstyp noch eine Funktion GetLine(int nIndex).
    Beim kompilieren ich bekomme immer Fehler:

    Tag10_1Doc.h(40): error C2143: syntax error : missing ';' before '*'
    Tag10_1Doc.h(42): error C2143: syntax error : missing ';' before '*'
    Tag10_1Doc.h(40): error C2501: 'CTag10_1Doc::AddLine' : missing storage-class or type specifiers
    Tag10_1Doc.h(40): error C2501: 'CTag10_1Doc::CLine' : missing storage-class or type specifiers
    Tag10_1Doc.h(42): error C2501: 'CTag10_1Doc::CLine' : missing storage-class or type specifiers
    Tag10_1Doc.h(42): error C2501: 'CTag10_1Doc::GetLine' : missing storage-class or type specifiers
    Tag10_1Doc.h(40): warning C4183: 'AddLine': missing return type; assumed to be a member function returning 'int'
    Tag10_1Doc.h(42): warning C4183: 'GetLine': missing return type; assumed to be a member function returning 'int'
    

    Da sind diese zwei Funktionen. Die sind im Tag10_1Doc.h als public deklariert.

    CLine * AddLine(CPoint ptFrom, CPoint ptTo) //(Zeile 40)
    {
    	//Ein neues CLine-Object erzeugen
    	CLine *pLine = new CLine(ptFrom, ptTo);
    	try
    	{
    		//Die neue Linie in das Object-Array einfügen
    		m_oaLines.Add(pLine);
    		//Dokument als bearbeitet markieren
    		SetModifiedFlag();
    	}
    	//Ist speicherausnahme aufgetretten?
    	catch(CMemoryException* perr)
    	{
    		//Meldung für Benutzer, schlechte
    		//Neuigkeiten mitteilen
    		AfxMessageBox("Speichermangel", MB_ICONSTOP | MB_OK);
    		//Wurde Linienobject erzeugt?
    		if(pLine)
    		{
    			//Object löschen
    			delete pLine;
    			pLine = NULL;
    		}
    		//Ausnahmeobject löschen
    		perr->Delete();
    	}
    	return pLine;
    }
    
    CLine * GetLine(int nIndex)                 //(Zeile 42)
    {
    	//Zeiger auf Linienobject für die angegeben
    	//Position in Objectarray zurückgeben
    	return (CLine*)m_oaLines[nIndex]; //m_osLines ist eine Variable von Typ CObArray
    }
    

    "Line.h" habe ich überall includet.
    Kann mir jemand weiter helfen? Ich wäre dankbar für jeder Hilfe.



  • Hallo,

    poste mal die richtige Zeilen der Header-Datei (oder die richtige Header-Datei), denn die Zeilennummern und die Fehler passen nicht zu dem von dir angegebenen Code-Teil...

    MfG



  • Benutze mal den menschlichen Zeichenweisen Debugger und kontrolliere, ob Du auch an alle entscheidenenden Stellen ein Semikolon gesetzt hast, wie sieht es mit Klammerpaaren aus...Zuweisungen statt Vergleiche, die ganzen Flüchtigkeitsfehler eben.

    Ausserdem ein guter Tipp. Direkt mit Windows/ MFC Programmiereung anzufangen ist IMHO keine gute Idee. Besorg Dir ein Buch wie "C++ in 21 Tagen" (nimm das mit den Tagen nicht so ernst und schau mal die Buch und Tutorialkritiken hier auf der Seite an- da gibt es ne Menge Bücher. Geh mal in einen Buchladen und lies ein bisschen darin rum, dann sieht man oft, womit man klar kommt und womit nicht) und schreibe Konsolenanwendungen. Kann man ruhig mit VS.NET 2003 machen und lern erstmal die elementaren Grundlagen. Meistens schreibt man dann am Anfang keine besonders interessanten Programme, dafür lernt man sehr wichtige Sachen. Wenn Du damit durch bist wird Dir MFC, .NET oder was auch immer viel leichter fallen.



  • Also, hier ist 'Line.h':

    #pragma once
    #include "atltypes.h"
    
    // CLine command target
    
    class CLine : public CObject
    {
    public:
    	CLine(CPoint ptFrom, CPoint ptTo);
    	virtual ~CLine();
    private:
    	CPoint m_ptFrom;
    	CPoint m_ptTo;
    public:		
    	void Draw(CDC* pDC);
    };
    

    Line.cpp

    #include "stdafx.h"
    #include "Tag10_1.h"
    #include "MainFrm.h"
    #include "Line.h"
    #include ".\line.h"
    
    // CLine
    
    CLine::CLine(CPoint ptFrom, CPoint ptTo)
    {
    	//Anfang und Endpunkte initialisieren
    	m_ptFrom = ptFrom;
    	m_ptTo = ptTo;
    }
    
    CLine::~CLine()
    {
    }
    
    // CLine member functions
    
    void CLine::Draw(CDC* pDC)
    {
    	//Linie zeichnen
    	pDC->MoveTo(m_ptFrom);
    	pDC->LineTo(m_ptTo);
    }
    

    Tag10_1Doc.cpp

    //
    
    #include "stdafx.h"
    #include "Tag10_1.h"
    #include "MainFrm.h"
    #include "Line.h"
    #include "Tag10_1Doc.h"
    #include ".\tag10_1doc.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // CTag10_1Doc
    
    IMPLEMENT_DYNCREATE(CTag10_1Doc, CDocument)
    
    BEGIN_MESSAGE_MAP(CTag10_1Doc, CDocument)
    END_MESSAGE_MAP()
    
    // CTag10_1Doc Erstellung/Zerstörung
    
    CTag10_1Doc::CTag10_1Doc()
    {
    	// TODO: Hier Code für One-Time-Konstruktion einfügen
    
    }
    
    CTag10_1Doc::~CTag10_1Doc()
    {
    }
    
    BOOL CTag10_1Doc::OnNewDocument()
    {
    	if (!CDocument::OnNewDocument())
    		return FALSE;
    
    	// TODO: Hier Code zur Reinitialisierung einfügen
    	// (SDI-Dokumente verwenden dieses Dokument)
    
    	return TRUE;
    }
    
    // CTag10_1Doc Serialisierung
    
    void CTag10_1Doc::Serialize(CArchive& ar)
    {
    	if (ar.IsStoring())
    	{
    		// TODO: Hier Code zum Speichern einfügen
    	}
    	else
    	{
    		// TODO: Hier Code zum Laden einfügen
    	}
    }
    
    // CTag10_1Doc Diagnose
    
    #ifdef _DEBUG
    void CTag10_1Doc::AssertValid() const
    {
    	CDocument::AssertValid();
    }
    
    void CTag10_1Doc::Dump(CDumpContext& dc) const
    {
    	CDocument::Dump(dc);
    }
    #endif //_DEBUG
    
    // CTag10_1Doc-Befehle
    
    CLine* CTag10_1Doc::AddLine(CPoint ptFrom, CPoint ptTo)
    {
    	//Ein neues CLine-Object erzeugen
    	CLine *pLine = new CLine(ptFrom, ptTo);
    	try
    	{
    		//Die neue Linie in das Object-Array einfügen
    		m_oaLines.Add(pLine);
    		//Dokument als bearbeitet markieren
    		SetModifiedFlag();
    	}
    	//Ist speicherausnahme aufgetretten?
    	catch(CMemoryException* perr)
    	{
    		//Meldung für Benutzer, schlechte
    		//Neuigkeiten mitteilen
    		AfxMessageBox("Speichermangel", MB_ICONSTOP | MB_OK);
    		//Wurde Linienobject erzeugt?
    		if(pLine)
    		{
    			//Object löschen
    			delete pLine;
    			pLine = NULL;
    		}
    		//Ausnahmeobject löschen
    		perr->Delete();
    	}
    	return pLine;
    }
    
    int CTag10_1Doc::GetLineCount()
    {
    	//Größe des Arrays zurückgeben
    	return m_oaLines.GetSize();
    }
    
    CLine* CTag10_1Doc::GetLine(int nIndex)
    {
    	//Zeiger auf Linienobject für die angegeben
    	//Position in Objectarray zurückgeben
    	return (CLine*)m_oaLines[nIndex];
    }
    

    Tag10_1Doc.h

    #pragma once
    #include "afxcoll.h"
    
    class CTag10_1Doc : public CDocument
    {
    protected: // Nur aus Serialisierung erstellen
    	CTag10_1Doc();
    	DECLARE_DYNCREATE(CTag10_1Doc)
    
    // Attribute
    public:
    
    // Operationen
    public:
    
    // Überschreibungen
    	public:
    	virtual BOOL OnNewDocument();
    	virtual void Serialize(CArchive& ar);
    
    // Implementierung
    public:
    	virtual ~CTag10_1Doc();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // Generierte Funktionen für die Meldungstabellen
    protected:
    	DECLARE_MESSAGE_MAP()
    public:
    	CObArray m_oaLines;
    	CLine * AddLine(CPoint ptFrom, CPoint ptTo);
    	int GetLineCount(void);
    	CLine * GetLine(int nIndex);
    };
    

    Ich bin Anfänger, wenn um C++ geht. Ich habe einige Büche schon gelesen, und mit Syntax, ich denke, ich bin auch vertraut. Alle Tutorials(fast) sind für VC++6 geschrieben, und da sind schon gewiese Unterschiede mit VS.Net.



  • Also Leute. Ich habe vergessen in 'Tag10_1.h' 'Line.h' einbinden.Entschuldigen für die Störung.



  • Physikalischer Fehler schrieb:

    Benutze mal den menschlichen Zeichenweisen Debugger und kontrolliere, ob Du auch an alle entscheidenenden Stellen ein Semikolon gesetzt hast, wie sieht es mit Klammerpaaren aus...Zuweisungen statt Vergleiche, die ganzen Flüchtigkeitsfehler eben.

    Ich weiß zwar jetzt nicht was du mit "Zeichenweisen Debugger" meinst (vieleicht gibt es ja in VC++ etwas wovon ich nichts weiß) aber IMHO kann man den Debugger erst verwenden wenn sich das Programm kompilieren läßt. Die von Dir angesprochen Fehler lassen sich allso damit nicht finden. Macht aber nicht da der kompiler bereits Fehler mit Zeilennummern auswirft.



  • es geht mehr um den menschlichen debugger (also Du selbst), der zeichen für zeichen den eigenen Code liest.... 😉


Anmelden zum Antworten