Hilfe bei rechteck programieren! komischer fehler



  • hallo, bin ein ziemlicher versager in sachen programierung ganz zu anfang!!!
    so nun mein problem
    wir haben die aufgabe in der schule bekommen, das wir ein rechteck programieren sollen. also der bildschirm soll seitea,b angeben den umfang und den flächeninhalt.
    nun habe ich es mal probiert was zu machen aber iwie mit wenig erfolg habe voll die komische fehlermeldung und komme nicht weiter. würde mich freuen wenn mir hier jemand helfen könnte da ich nicht besonders viel verstehe.
    das ist mein bisheriger code:

    #include "stdio.h"

    ////////////////////////////////////DEKLARATION//////////////////////////////
    class crechteck
    {
    private:
    crechteck(); //default konstruktor
    double nseiteA;
    double nseiteB;

    public:
    crechteck(double,double); //konstruktor
    crechteck( crechteck& creck); //copy konstruktor

    double flaeche;
    double umfang;
    double berechneflaeche();
    double berechneumfang();

    };

    //////////////////////////////////////DEFINITION//////////////////////////////
    crechteck::crechteck()
    {
    nseiteA = 10.5;
    nseiteB = 5.2;
    }

    crechteck::crechteck(double aseiteA,double aseiteB)
    {
    nseiteA = aseiteA;
    nseiteB = aseiteB;
    }

    double crechteck::berechneflaeche
    {
    berechneflaeche = seiteA*seiteB;
    printf("die Flaeche betraegt:%i\n",berechneflaeche(double, double);
    }

    double crechteck::berechneumfang
    {
    berechneumfang = (2*seiteA)+(2*seiteB);
    printf("Der Umfang betraegt:%i",berechneflaeche();
    }

    crechteck::crechteck(double seiteA, double seiteB)
    {
    this->nseiteA = aseiteA;
    this->nseiteB = aseiteB;
    }

    creckteck::crechteck(crechteck &c)/////////////
    {
    HUHU nseiteA = crechteck
    HUHU nseiteB = crechteck
    }

    /////////////////////////////////////HAUPTPROGRAMM/////////////////////////////////
    void main()
    {

    }

    habe in der main funktion bewusst noch nichts stehen, da ich erstmal alle fehler wegbekommen wollte. ist das der falsche weg oder kann man das so machen???
    würde mich über jede antwort freuen.

    achso das ist der fehler der mir noch angezeigt wird:
    Kompilierung läuft...
    Cquadrat.cpp
    C:\Programieren\quadrat\Cquadrat.cpp(43) : fatal error C1001: INTERNER COMPILER- FEHLER
    (Compiler-Datei "msc1.cpp", Zeile 1786)
    Bitte wählen Sie im Menü "?" von Visual C++
    den Befehl "Software Service", oder öffnen Sie die Hilfedatei für den Software Service, um weitere Informationen zu erhalten
    Fehler beim Ausführen von cl.exe.

    Cquadrat.exe - 1 Fehler, 0 Warnung(en)

    MFG
    Christian!!!!



  • printf("die Flaeche betraegt:%i\n",berechneflaeche(double, double);
    

    Da fehlt eine ) am Schluss... Desweiteren musst du werte übergeben... nicht typen...

    Gruß
    zeigerzeiger



  • okay danke ich werde mal schauen

    habs korrigiert aber immernoch der behinderte fehler

    weiß jemand vielleicht was der bedeutet???? ich jedenfalls vesteh gar nich was der will mit seinem fehler da.

    mfg
    christian



  • Btw...
    du solltest schon die Funktionen implementieren sprich beim Rumpf hinter den Namen ( ).

    Und C++ ist nicht Visual Basic



  • sry aber das kapier ich nicht.
    bitte nich ausrasten wegen meiner blödheit



  • NeoSR schrieb:

    sry aber das kapier ich nicht.

    Du musst auch in der Definition hinter einer Funktion eine Parameterliste in () schreiben. Auch wenn diese Leer ist:
    z.B. double crechteck::berechneumfang**()**

    double crechteck::berechneflaeche
    {
      berechneflaeche = seiteA*seiteB;
      printf("die Flaeche betraegt:%i\n",berechneflaeche(double, double);
    }
    

    Sollte wohl eher so aussehen

    double crechteck::berechneflaeche()
    {
      double ergebnis = seiteA * seiteB;
      printf("die Flaeche betraegt:%i\n", ergebnis);
      return ergebnis;
    }
    

    1. Du willst ja was zurückgeben, zumindest deutet es das "double crechteck::berechneflaeche()" an, also brauchen wir ein return.

    2. Das was du zuerst im printf angegeben hast ist ein Funktionsaufruf, da gehören wenn schon Werte rein (nicht typen) und zudem hast du keine solche Funktion, die zwei Werte akzeptiert.

    3. Die Angabe %i im printf ist mit Sicherheit nicht das gewünschte, wenn du mit double-Typen arbeitest. "%i" steht für, ich zitiere "Signed decimal integer" - du hast aber keinen Integer (Ganzzahlentyp) sondern einen Gleitkommawert (z.B. %f).

    4. Vielleicht solltest du dir ein einfaches Einsteigerbuch oder Tutorial suchen und wirklich von Begin an durchgehen. Irgendwie habe ich hier den Eindruck das du versucht hast über das Ziel zu schießen ohne die absoluten Grundsachen verstanden zu haben (Ist nicht böse gemeint).

    cu André



  • ah danke das verstehe ich nun, mit beispielen ist das eh viel besser zu erklären denke ich als nur mit text. werde es morgen umändern und schauen was passiert
    DANKE DANKE DANKE schonmal.
    mfg
    christian!!!



  • 1. dein copy- construktor ist müll, sollte ungefähr so lauten:

    crechteck::crechteck(const crechteck &scr){
     seiteA= scr.seiteA;
     seiteB= scr.seiteB;
    }
    

    2. du hast 2 mal den gleiche Konstruktor implementiert



  • NeoSR schrieb:

    habs korrigiert aber immernoch der behinderte fehler

    weiß jemand vielleicht was der bedeutet???? ich jedenfalls vesteh gar nich was der will mit seinem fehler da.

    Das bedeutet, das Microsoft einen Fehler in seinem Compiler hat. f'`8k

    Autocogito

    Gruß, TGGC (making great games since 1992)



  • Reitet doch nicht auf Nebensächlichkeiten rum...

    #ifndef RECTANGLE_T_HXX_INCLUDED
    #define RECTANGLE_T_HXX_INCLUDED RECTANGLE_T_HXX_INCLUDED
    
    #include <ostream>
    
    template< typename T >
    class rectangle_t {
    
    	template< typename T >
    	friend std::ostream& operator<<( std::ostream &stream, const rectangle_t< T > &object );
    
    	private:
    
    		T m_width, m_height;
    		T m_perimeter, m_area;
    
    		void update( ) {
    
    			m_perimeter = 2 * m_width + 2 * m_height;
    			m_area = m_width * m_height;
    		}
    
    	public:
    
    		const T& width, &height;
    		const T& perimeter, &area;
    
    		rectangle_t( ) : m_width( 0 ), m_height( 0 ), m_perimeter( 0 ), m_area( 0 ), width( m_width ), height( m_height ), perimeter( m_perimeter ), area( m_area )  { };
    		rectangle_t( T width, T height ) : m_width( width ), m_height( height ), m_perimeter( 2 * width + 2 * height ), m_area( width * height ), width( m_width ), height( m_height ), perimeter( m_perimeter ), area( m_area ) { };
    		rectangle_t( const rectangle_t& other ) : m_width( other.m_width ), m_height( other.m_height ), m_perimeter( other.m_perimeter ), m_area( other.m_area ), width( m_width ), height( m_height ), perimeter( m_perimeter ), area( m_area )  { };
    
    		void set_width( T width ) { m_width = width; update( ); }
    		void set_height( T height ) { m_height = height; update( ); }
    		void set_width_height( T width, T height ) { m_width = width; m_height = height; update( ); }
    
    		// todo: operator=( )  ;)
    };
    
    template< typename T >
    std::ostream& operator<<( std::ostream& stream, const rectangle_t< T > &object ) {
    
    	stream << "Rectangle (width: " << object.m_width << ", height: " << object.m_height << ")";
    
    	return stream;
    }
    
    #endif /* ifndef RECTANGLE_T_HXX_INCLUDED */
    
    #include <iostream>
    
    #include "rectangle_t.hxx"
    
    int main( ) {
    
    	rectangle_t< float > rectangle( 5, 4.2 );
    
    	std::cout << rectangle << std::endl;
    	std::cout << "Area:      " << rectangle.area << std::endl;
    	std::cout << "Perimeter: " << rectangle.perimeter << std::endl;
    }
    

    ich bin neugierig: Was machst jetzt mit deinem Rechteck?

    greetz, Swordfish



  • Swordfish schrieb:

    const T& width, height;
    const T& perimeter, area;
    

    Dir ist klar, daß height und area keine Referenzen sind, sondern Kopien? (und daß dein Copy-Ctor auch Unsinn macht:

    rectangle_t<double> r1;
    rectangle_t<double> r2 = r1;
    r1.set_width(40);
    cout<<r2.perimeter;
    


  • CStoll schrieb:

    Swordfish schrieb:

    const T& width, height;
    const T& perimeter, area;
    

    Dir ist klar, daß height und area keine Referenzen sind, sondern Kopien? [...]

    Autsch! 😡
    Danke 😉

    CStoll schrieb:

    (und daß dein Copy-Ctor auch Unsinn macht:

    rectangle_t<double> r1;
    rectangle_t<double> r2 = r1;
    r1.set_width(40);                 // !?
    cout<<r2.perimeter;
    

    ?

    greetz, Swordfish



  • Swordfish schrieb:

    CStoll schrieb:

    (und daß dein Copy-Ctor auch Unsinn macht:

    rectangle_t<double> r1;
    rectangle_t<double> r2 = r1;
    r1.set_width(40);                 // !?
    cout<<r2.perimeter;
    

    ?

    OK, da habe ich wohl schief geguckt, aber bei so einer langen Initialisierungsliste ist etwas Übersicht hilfreich 😉

    (PS: Aber dafür fehlt etwas anderes: ein funktionsfähiger op= (die Default-Version scheitert an den Referenzen))



  • Aja, hab' das als todo angemerkt. 😉

    greetz, Swordfish


Anmelden zum Antworten