Anfänger braucht Hilfe



  • Servus ,
    ich bin gerade dabei mit dem Buch "C++ für Schnelleinsteiger" das Programmieren zu lernen ..
    Bei der 2. Übungsaufgabe gibts aber schon Probleme ..

    Die Aufgabe ist folgende:

    Schreiben sie einer Header-Datei "quadrat.h", in der sie ein Makro QUADRAT(x) definieren, das x durch das Quadrat von x ersetzt. Testen sie das Makro mit Hilfe des folgenden Programms:

    #include <iostream>
    #include "quadrat.h"
    using namespace std;
    void main()
    {
    	cout << "QUADRAT(5)		= " << QUADRAT(5)	<< "\n";
    	cout << "QUADRAT(2+3)	= " << QUADRAT(2+3)	<< "\n";
    }
    

    Gesagt getan, hab ich mein Projekt "Quadrat Berechnung" angelegt.
    Hier alle Dateien darin:

    Makefile

    all : QRechner
    QRechner : QRechner.cpp
    clean :
    

    quadrat.h

    #define QUADRAT(x) x*x
    

    QRechner.cpp

    #include <iostream>
    #include "quadrat.h"
    using namespace std;
    void main()
    {
    	cout << "QUADRAT(5)		= " << QUADRAT(5)	<< "\n";
    	cout << "QUADRAT(2+3)	= " << QUADRAT(2+3)	<< "\n";
    }
    

    Jetzt hab ich folgenden Error:

    QRechner.cpp:4: Fehler: »::main« muss »int« zurückgeben
    make: *** [QRechner] Fehler 1
    make: Das Target »all« wurde wegen Fehlern nicht aktualisiert.
    

    Ich benutze Eclipse, Betriebssystem ist Ubuntu.

    Würde mich über Hilfe freuen 🙂

    Gruß
    Felix



  • #include <iostream>
    #include "quadrat.h"
    using namespace std;
    int main()
    {
        cout << "QUADRAT(5)        = " << QUADRAT(5)    << "\n";
        cout << "QUADRAT(2+3)    = " << QUADRAT(2+3)    << "\n";
    }
    

    Die Fehlermeldung sagt ja bereits alles. 😉 (Hier kann der Rückgabewert vernachlässig werden, im Gegensatz zu anderen Funktionen, da main bei gelingen automatisch 0 zurückgibt).

    btw:
    Schön, dass void main mal bemängelt wird. 🙂 (geht halt eben nicht immer..)



  • Fehlermeldung schrieb:

    »::main« muss »int« zurückgeben

    dann machs doch einfach...

    int main()
    {
        cout << "QUADRAT(5)        = " << QUADRAT(5)    << "\n";
        cout << "QUADRAT(2+3)    = " << QUADRAT(2+3)    << "\n";
        return 0;
    }
    

    im Übrigen ist die Variante "void main()" zwar in Büchern verbreitet, aber leider ungültig

    in C ging immerhin noch

    main()

    da hier default-int angenommen wurde.
    das return konnte man auch vergessen, da der Compiler hier ebenfalls einafch ein "return 0" angenommen hat.

    aber "void main()" ist definitiv verkehrt 😉

    MfG DrakoXP



  • Danke ,geht ja echt schnell hier 😮 !
    Komisch ,warum wird im Buch void main geschrieben ,wenns gar nicht funktioniert 👎

    Gruß
    Felix



  • eXtremeCostumez schrieb:

    Komisch ,warum wird im Buch void main geschrieben ,wenns gar nicht funktioniert

    Ganz einfach. Das Buch ist Mist.
    Wenn du finanziell nicht gerade am Abgrund hängst und ernsthaft C++ lernen willst, dann kauf dir ein anderes Werk. Der C++ Primer z.B ist imo eines der besten Anfänger Werke:
    http://www.amazon.de/C-Primer-Stanley-B-Lippman/dp/382732274X

    Es lohnt sich auf jeden Fall, ansonsten plagst du dich noch länger mit solchen Problemen rum, da der Autor offensichtlich nicht viel Ahung von C++ hat.



  • Hm..na dann muss ich mich wohl wirklich nach nem anderen Buch umsehen. Werd jetzt aber erst mal noch 1-2 Kapitel in dem Buch machen ,wenn solche Probleme wieder auftauchen ,hol ich mir n anderes. 😞

    Gruß



  • leicht off-topic

    Das von dir (oder dem Buch) definierte Makro hat einen gewaltigen Haken. Dieser fällt gerade bei deinem zweiten Makroaufruf ins Gewicht.

    Makros führen einen reinen Textersatz durch. Aus QUADRAT(2+3) würde demnach 2+3*2+3, was 11 ergibt und nicht wie vielleicht erwartet 25.

    Deher sollte man in diesen Fällen die Parameter grundsätzlich klammern:

    #define QUADRAT(x) (x)*(x)
    

    So wird aus QUADRAT(2+3) (2+3)*(2+3), was das richte Ergebnis liefert.

    In C++ verwendet man daher auch lieber gleich inline-Funktionen, welche dann auch gleich typsicher sind.

    inline int quadriere(int a)
        {
            return a * a;
        }
    

    Wobei inline hier nur ein Hinweis für den Compiler ist und keine Garantien.

    Grüße... Heiko



  • @bwbg

    Ich denke mal, dass das die Intention des Autors war auf diese Tatsache hinzuweisen.

    Wenn nicht, dann sollte sich der TO nicht nur ein neues Buch kaufen, sondern das alte in einem möglichst grausamen Ritual verbrennen. 😉



  • Ok ,hier war ausnahmsweiße nicht der Autor schuld ,war natürlich mein Fehler 😉
    Hab ich aber nach dem ersten Test auch gemerkt 👍

    Mal nochmal allgemein: Gibts auch gute C++ Bücher mit Preisen ,die auch für Schüler human sind ?



  • Es gibt sie sogar gratis, wenn du Englisch kannst und gerne pdf's liest. 😉

    http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html



  • Oh JAAAAA! Die Bücherfrage. Endlich gibt es wieder etwas Vernünftiges zu diskutieren.



  • P.S.: Hab die Forensuche noch nie verwendet, daher weiß ich nicht ob sie was taugt, aber gerade zur Bücherfrage sollte es massenweise Beiträge geben.



  • Jaja ,sry.
    Da hab ich wohl zuerst gefragt und dann die Boardsuche verwendet .. 😡
    Kommt nicht wieder vor 🙄



  • bwbg schrieb:

    #define QUADRAT(x) (x)*(x)
    

    Ich würde hier sogar nochmal klammern, da sonst erst wieder was unerwartetes rauskommen kann.

    #define QUADRAT(x) (x)*(x)
    #define QUADRAT2(x) ((x)*(x))
    
    double a = 1.0 / QUADRAT(2.0);  // unerwartet: 1.0 /  (2.0) * (2.0)  => 1.0
    double b = 1.0 / QUADRAT2(2.0); // besser:     1.0 / ((2.0) * (2.0)) => 0.25
    

Log in to reply