C++ Error



  • @Programmer33 Nehme erstmal in allen *.h das using komplett raus. Wenn es irgendwo gebraucht wird mach jeweils ein std:: vor...

    Dann in allen *.cpp das using namespace unter dem letzten include. Oder nimm es auch raus und mach auch immer ein std:: vor (std::endl, std::cout etc)



  • und setze die Fehlermeldungen auch in code-tags...



  • das hat die fehler nur verdoppelt lol.

    Mache sie jetzt wieder rein.



  • @Programmer33 Nein! Nochmal den Code mit Fehlermeldung in code-tags. Woher sollen wir wissen was gerade bei dir aktuell ist...



  • 
    Description	Resource	Path	Location	Type
    make: *** [CScreen.o] Error 1	WS14		 	C/C++ Problem
    unknown type name 'CScreen'	CRectangle.h	/WS14	line 104	C/C++ Problem
    

    Diese Zeile wird angezeigt :void draw(CScreen& screen) const;

    Die ist auch nicht implementiert ?
    Vielleicht liegt es daran lol



  • #include "CRectangle.h"
    

    gehört nicht in CScreen.h. Wird nicht gebraucht.



  • @Programmer33 Bei mir funktioniert es nach den entsprechenden Änderungen. Alle usings in .h raus, using in .cpp unter den letzten include. vor ostream ein std:: und die CRectangle.h raus aus CScreen.h. Nur ein Warning wg. ungenutzeten Parameter. Die CPoint.cpp hab ich jetzt nicht probiert.



  • #include "CScreen.h"
    #include "CRectangle.h"
    #include "CPoint.h"
    
    
    int main() {
            CScreen scr;
            CRectangle rec;
            CPoint p;
    
            return 0;
    }
    
    dirk@schleppi:~/develop/cpp/c-plusplus.net/tests> g++ -Wall -W --std=c++17 CScreen.cpp CRectangle.cpp CPoint.cpp  main.cpp 
    CRectangle.cpp: In Elementfunktion »void CRectangle::draw(CScreen&) const«:
    CRectangle.cpp:71:32: Warnung: unverwendeter Parameter »screen« [-Wunused-parameter]
     void CRectangle::draw(CScreen& screen) const
                           ~~~~~~~~~^~~~~~
    dirk@schleppi:~/develop/cpp/c-plusplus.net/tests> 
    


  • Meinst du dass ich nur bei den Headern das using raus holen soll?
    Oder bei allen ?
    Ich habe gedacht vielleicht implementiere ich einfach die Methode um Fehler weg zu bekommen😀
    /**
    * Zeichnet das Rechteck in das ¸bergebene Bildschirmobjekt. Das heisst,
    * es werden mit CScreen::setPoint die Werte aller "Punkte", die im
    * Bereich des Rechtecks liegen, auf das F¸llzeichen des Rechtecks gesetzt.
    */
    void draw(CScreen& screen) const;

    meine Idee :

    
    void CRectangle::draw(CScreen& screen) const
    {
    	CScreen::setPoint(CPoint point,'#') = screen;
    	
    	
    }
    

    Ist die Idee wenigstens teilweise richtig ?



  • @Programmer33 ja, usings aus allen headern raus. und in den cpps unter dem letzten #include....*)

    Ich habe nur ein Warning. Es ging erstmal nur darum das es übersetzt.... Dann weiter schauen.

    Dein Code: ?!? Ähhmm... CScreen::setPoint() gibt nix zurück. Keine Referenz, nix. Da gibt's nix zum zuweisen. Ich empfehle nochmal den Breymann. Das ist kein Hobby, das willst Du in Zukunft als Beruf machen...

    Edit: Damit meine ich das using namespace... nach unten verschieben, unter dem letzten #include. in allen cpps. Und auf jden Fall aus allen *.h raus.



  • @Programmer33 Und das Warning ist in Ordnung wenn die Funktion noch leer ist. Überhaupt kein Problem.

    Mach die Änderungen wie oben beschrieben.



  • Sobald ich das using namespace aus den Headern raus nehme:

    Description	Resource	Path	Location	Type
    'CPoint' does not refer to a value	CRectangle.cpp	/WS14	line 80	C/C++ Problem
    call to non-static member function without an object argument	CRectangle.cpp	/WS14	line 80	C/C++ Problem
    make: *** [CRectangle.o] Error 1	WS14		 	C/C++ Problem
    Return has value, in function returning void	CRectangle.cpp	/WS14	line 80	Code Analysis Problem
    unknown type name 'ostream'; did you mean 'std::ostream'?	CRectangle.h	/WS14	line 110	C/C++ Problem
    unknown type name 'ostream'; did you mean 'std::ostream'?	CRectangle.h	/WS14	line 112	C/C++ Problem
    'std::ostream' declared here	WS14		line 147, external location: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iosfwd	C/C++ Problem
    declared here	CPoint.h	/WS14	line 18	C/C++ Problem
    
    

    Das mit dem ostream bekomme ich ja mit std:: weg aber die anderen ?

    Komisch



  • Es sind jetzt doch die Fehler weg . Eclipse spinnt doch.

    Zu deiner Frage : Ich will leider Informatik nicht zu meinem Beruf machen .

    Es ist nur im Mathe Studium 1 Fach .
    Auch wenn es dich vielleicht enttäuscht😁

    Was wollen die genau bei der draw methode ?



  • @Programmer33

    Habe nur die oben schon öfter angesprochenen Sachen geändert und eine Test-main geschrieben (Es waren wirklich nur die minimalen Änderungen oben):

    // CScreen.cpp
    
    #include <iostream>
    #include "CScreen.h"
    
    using namespace std;
    
    
    CScreen::CScreen()
    {
    	clear();
    }
    
    void CScreen::setPoint(CPoint point, char content)
    {
    	if (point.getX() < 0 || point.getY() < 0
    			|| point.getY() * 80 + point.getX() >= 24*80) {
    		return;
    	}
    	m_content[point.getY() * 80 + point.getX()] = content;
    }
    
    void CScreen::print() const
    {
    	cout << "    ";
    	for (int col = 0; col < 80; col++) {
    		cout << col / 10;
    	}
    	cout << endl;
    	cout << "    ";
    	for (int col = 0; col < 80; col++) {
    		cout << col % 10;
    	}
    	cout << endl;
    	for (int row = 23; row >= 0; row--) {
    		if (row < 10) {
    			cout << ' ';
    		}
    		cout << row << ": ";
    		for (int col = 0; col < 80; col++) {
    			cout << m_content[row * 80 + col];
    		}
    		cout << endl;
    	}
    	cout << endl;
    }
    
    void CScreen::clear() {
    	for (int i = 0; i < 24*80; i++) {
    		m_content[i] = '.';
    	}
    }
    
    
    // CScreen.h
    
    #ifndef ASCIISCREENSOLUTION_MYCODE_CSCREEN_H_
    #define ASCIISCREENSOLUTION_MYCODE_CSCREEN_H_
    
    #include <iostream>
    #include "CPoint.h"
    //#include "CRectangle.h"
    #include "CScreen.h"
    
    /**
     * Dies Klasse repr‰sentiert einen Bereich von 80x24 "Punkten",
     * die als ein beliebiges Zeichen dargestellt werden kˆnnen.
     */
    class CScreen
    {
    private:
    	/** Der Speicher f¸r die Darstellung der Punkte. */
    	char m_content[24*80];
    
    public:
    	/**
    	 * Erzeugt eine neue Darstellung, bei der alle Punkte
    	 * auf den Wert '.' gesetzt sind.
    	 */
    	CScreen();
    
    	/**
    	 * Setzt den angegebenen Punkt auf das angegebene Zeichen.
    	 */
    	void setPoint(CPoint point, char content);
    
    	/**
    	 * Gibt die Darstellung aus.
    	 */
    	void print() const;
    
    	/**
    	 * Lˆscht die Darstellung. Alle Zeichen werden wieder auf
    	 * '.' gesetzt.
    	 */
    	void clear();
    };
    
    #endif /* ASCIISCREENSOLUTION_MYCODE_CSCREEN_H_ */
    
    
    // CPoint.cpp
    
    #include<iostream>
    #include "CPoint.h"
    
    using namespace std;
    
    CPoint::CPoint(int x, int y)
    {
    	m_x = x;
    	m_y = y;
    }
    
    void CPoint::setX(int x)
    {
    	m_x = x;
    }
    
    void CPoint::setY(int y)
    {
    	m_y = y;
    }
    
    int CPoint::getX() const
    {
    	return m_x;
    }
    
    int CPoint::getY() const
    {
    	return m_y;
    }
    
    bool CPoint::operator ==(const CPoint& other) const
    {
    	return m_x == other.m_x && m_y == other.m_y;
    }
    
    bool CPoint::operator !=(const CPoint& other) const
    {
    	return m_x != other.m_x || m_y != other.m_y;
    }
    
    
    // CPoint.h
    
    #ifndef ASCIISCREENSOLUTION_MYCODE_CPOINT_H_
    #define ASCIISCREENSOLUTION_MYCODE_CPOINT_H_
    #include<iostream>
    
    
    
    /**
     * Diese Klasse repr‰sentiert einen Punkt ein einem Ganzzahl-Koordinatensystem.
     */
    class CPoint
    {
    private:
    	/** Die x-Koordinate (Spalte) */
    	int m_x;
    	/** Die y-Koordinate (Zeile) */
    	int m_y;
    
    public:
    	/**
    	 * Erzeugt ein neues Objekt mit den angegeben
    	 * Werten f¸r die x- und y-Koordinate.
    	 */
    	CPoint(int x = 0, int y = 0);
    
    	/**
    	 * Setzt die x-Koordinate auf den angegebenen Wert.
    	 */
    	void setX(int x);
    
    	/**
    	 * Setzt die y-Koordinate auf den angegebenen Wert.
    	 */
    	void setY(int y);
    
    	/**
    	 * Liefert den Wert der x-Koordinate.
    	 */
    	int getX() const;
    
    	/**
    	 * Liefert den Wert der y-Koordinate.
    	 */
    	int getY() const;
    
    	/**
    	 * Pr¸ft, ob die x- und y-Koordinaten der Punkte ¸bereinstimmen.
    	 */
    	bool operator== (const CPoint& other) const;
    
    	/**
    	 * Pr¸ft, ob sich die x- und y-Koordinaten der Punkte unterscheiden.
    	 */
    	bool operator!= (const CPoint& other) const;
    };
    
    #endif /* ASCIISCREENSOLUTION_MYCODE_CPOINT_H_ */
    
    
    // CRectangle.cpp
    
    #include<iostream>
    #include "CRectangle.h"
    #include"CPoint.h"
    
    using namespace std;
    
    CRectangle::CRectangle(char fillChar)
    {
    	m_fillChar = fillChar;
    }
    
    CRectangle::CRectangle(CPoint bottomLeft, CPoint topRight, char fillChar)
    {
    	m_fillChar = fillChar;
    	if(topRight.getX() < bottomLeft.getX()){
    		topRight.setX(bottomLeft.getX());
    	}
    
        	if(topRight.getY() < bottomLeft.getY()){
             topRight.setY(bottomLeft.getY());
    	}
    }
    
    void CRectangle::setCorners(CPoint bottomLeft, CPoint topRight)
    {
    
    	if(topRight.getX() > bottomLeft.getX()){
    		   m_topRight = topRight;
    		   m_bottomLeft = bottomLeft;
    		}
    
    	    if(topRight.getY() >bottomLeft.getY()){
    	         m_bottomLeft = bottomLeft;
    	         m_topRight = topRight;
    	}
    }
    
    CPoint CRectangle::getBottomLeftCorner()const
    {
    	return m_bottomLeft;
    }
    
    CPoint CRectangle::getTopRightCorner() const
    {
    	return m_topRight;
    
    }
    
    void CRectangle::setFillChar(char fillChar)
    {
    	m_fillChar = fillChar;
    }
    
    char CRectangle::getFillChar() const
    {
    	return m_fillChar;
    }
    
    bool CRectangle::operator ==(const CRectangle& other) const
    {
    	return m_topRight == other.m_topRight &&  m_bottomLeft == other.m_bottomLeft &&m_fillChar == other.m_fillChar;
    
    }
    
    void CRectangle::draw(CScreen& screen) const
    {
    	// Bitte implementieren
    }
    
    ostream& operator<< (ostream& lhs, const CRectangle& rhs){
    
    	lhs << "CRectangle[(" << rhs.getBottomLeftCorner().getX() << "," <<rhs.getTopRightCorner().getY() << ")"<< ","<< "("<<rhs.getTopRightCorner().getX()<< ","<< rhs.getTopRightCorner().getY()<<"),"<< rhs.getFillChar()<<"]" << endl;
    	return lhs;
    
    }
    
    
    // CRectangle.h
    
    #ifndef ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_
    #define ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_
    
    #include <iostream>
    #include <string>
    #include "CScreen.h"
    #include "CPoint.h"
    
    /**
     * Diese Klasse beschreibt ein Rechteck in einem
     * Ganzzahl-Koordinatensystem ¸ber die Eigenschaften
     * "untere linke Ecke" und "obere rechte Ecke".
     *
     * Als zus‰tzliche Eigenschaft hat die Klasse ein Zeichen
     * (char) das bei der graphischen Darstellung als
     * F¸llzeichen verwendet wird.
     */
    class CRectangle
    {
    private:
    
    	CPoint m_bottomLeft;
        CPoint m_topRight;
    
    	 char m_fillChar;
    
    public:
    	/**
    	 * Erzeugt ein neues Rechteck mit linker unterer und
    	 * rechter oberer Ecke bei (0,0) und dem angegebenen
    	 * F¸llzeichen.
    	 */
    	CRectangle(char fillChar = '#');
    
    
    	/**
    	 * Erzeugt ein neues Rechteck mit der angegebenen linken
    	 * unteren und rechten oberen Ecken sowie dem angegebenen
    	 * F¸llzeichen.
    	 *
    	 * Beim Erzeugen wird die Zusicherung ¸berpr¸ft, dass die
    	 * rechte obere Ecke rechts von und oberhalt der linken
    	 * unteren Ecke liegen muss! Falls die x-Koordinate
    	 * der rechten oberen Ecke nicht grˆfler als die x-Koordinate
    	 * der linken unteren Ecke ist, wird sie auf den Wert
    	 * der x-Koordinate der linken unteren Ecke gesetzt. Falls
    	 * die y-Koordinate der rechten oberen Ecke nicht grˆfler als
    	 * die y-Koordinate der linken unteren Ecke ist, wird sie auf
    	 * dem Wert der y-Koordinate der linken unteren Ecke gesetzt.
    	 */
    	CRectangle(CPoint bottomLeft, CPoint topRight, char fillChar = '#');
    
    	/**
    	 * Weist den Eigenschaften "linke untere Ecke" und "rechte obere
    	 * Ecke" neue Werte zu.
    	 *
    	 * Vor der Zuweisung wird die Zusicherung ¸berpr¸ft, dass die
    	 * rechte obere Ecke rechts von und oberhalt der linken
    	 * unteren Ecke liegen muss! Ist das nicht der Fall wird keines
    	 * der Attribute ver‰ndert.
    	 */
    	void setCorners (CPoint bottomLeft, CPoint topRight);
    
    	/**
    	 * Liefert die linke untere Ecke des Rechtecks zur¸ck.
    	 */
    	CPoint getBottomLeftCorner() const;
    
    	/**
    	 * Liefert die rechte obere Ecke des Rechtecks zur¸ck.
    	 */
    	CPoint getTopRightCorner() const;
    
    	/**
    	 * Weist dem F¸llzeichen den angegebene Wert zu.
    	 */
    	void setFillChar(char fillChar = '#');
    
    	/**
    	 * Liefert den Wert des F¸llzeichens.
    	 */
    	char getFillChar() const;
    
    	/**
    	 * Pr¸ft, ob die beiden Rechtecke in allen Eigenschaften ¸bereinstimmen.
    	 */
    	bool operator== (const CRectangle& other) const;
    
    	/**
    	 * Zeichnet das Rechteck in das ¸bergebene Bildschirmobjekt. Das heisst,
    	 * es werden mit CScreen::setPoint die Werte aller "Punkte", die im
    	 * Bereich des Rechtecks liegen, auf das F¸llzeichen des Rechtecks gesetzt.
    	 */
    	void draw(CScreen& screen) const;
    
    	/**
    	 * Gibt eine textuelle Darstellung des Rechtecks auf dem ¸bergebenen
    	 * Ausgabestrom aus. Das Format ist in der Aufgabenstellung beschrieben.
    	 */
    	friend std::ostream& operator<< (std::ostream& lhs, const CRectangle& rhs);
    };
    std::ostream& operator<< (std::ostream& lhs, const CRectangle& rhs);
    
    
    #endif /* ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_ */
    
    
    // main.cpp
    
    #include "CScreen.h"
    #include "CRectangle.h"
    #include "CPoint.h"
    
    
    int main() {
    	CScreen scr;
    	CRectangle rec;
    	CPoint p;
    
    	return 0;
    }
    

    Ergibt bei mir:

    dirk@schleppi:~> g++ -Wall -W --std=c++17 CScreen.cpp CRectangle.cpp CPoint.cpp  main.cpp 
    CRectangle.cpp: In Elementfunktion »void CRectangle::draw(CScreen&) const«:
    CRectangle.cpp:73:32: Warnung: unverwendeter Parameter »screen« [-Wunused-parameter]
     void CRectangle::draw(CScreen& screen) const
                           ~~~~~~~~~^~~~~~
    dirk@schleppi:~>
    

    Die Warnung ist ok wegen der leeren Funktion. Und mehr wolltest Du erstmal nicht...

    Eclipse hat hier scheinbar einen schlechten Ruf. Hoffe du hast einen aktuellen Compiler dabei. Auf Windows nehmen viele Visual-Studio. Ich bin mit Linux unterwegs und benutze normalerweise QTCreator.

    using namespace std; vor #include, besonders vor compilereigene #includes erzeugen seltsame Fehler die keiner nachvollziehen kann/will.

    Für heute bin ich erstmal raus.

    hth

    PS: Für ein minimales Beispiel was hier immer gefordert wird sind deine Kommentare zu lang. Für dich selbst @home finde ich die aber gut. Beim nächsten mal bitte auch eine main() mitliefern.

    PPS: Code-tags für reinen Text geht mit ```text, gibt auch noch welche für xml usw.

    PPS: Sorry, wollte eigentlich alles in der Form: erst .h, dann .cpp posten. ist leider verdreht. Hab mit cat ... >all.cpp nicht aufgepasst



  • Ich habe in der main aber das using namespace gelassen .
    Da sonst Fehler kommen ?
    Das ist doch nicht falsch oder ?
    Was will man aber bei der Aufgabe hier ?
    /**
    * Zeichnet das Rechteck in das ¸bergebene Bildschirmobjekt. Das heisst,
    * es werden mit CScreen::setPoint die Werte aller "Punkte", die im
    * Bereich des Rechtecks liegen, auf das F¸llzeichen des Rechtecks gesetzt.
    */
    void draw(CScreen& screen) const;



  • @Programmer33

    eine verschachtelte for-Schleife. eine für x, und eine innere für y. da drinne mit setPoint die Punkte setzen, fettich... So grob nachgedacht. Aber ich bin zu müde dafür. Ich bin ursprünglich Maurer, ich hoffe das schockiert dich nicht...

    Edit: Der Algo bezieht sich auf ausgefüllte Rechtecke, wenn nur der Rahmen gezeichnet werden soll etwas anders. Aber heute nicht mehr...



  • haha aber woher kannst du so gut programmieren dann ?

    So ist die Aufgabe :
    https://picload.org/view/dciiiaao/bildschirmfoto2019-01-24um21.5.png.html



  • @Programmer33 Ich bin schon was älter und habe angefangen bevor ich von der Schule geschmissen worden bin... Und ich bin auch nicht gut. Bin hier um meine eingerosteten Fähigkeiten auf den aktuellen C++-Standard zu hieven...



  • Was sagst du zu der Aufgabe ?
    Wollen die ein Rechteck gezeichnet haben oder was genau?



  • @dirkski sagte in C++ Error:

    Obwohl: ist an der stelle das endl vielleicht nützlich wg. verschachtelter Aufrufe? Frage an das Forum.

    ???
    Nö! Wo siehst du denn da überhaupt einen Zusammenhang?

    @Programmer33 sagte in C++ Error:

    Es sind jetzt doch die Fehler weg . Eclipse spinnt doch.

    Ja, völlig wurscht, wenn Eclipse meint irgendwelche Fehler zu finden. Was der Komplier sagt zählt.


Anmelden zum Antworten