Anfang: Wer findet den kleinen Fehler?



  • Hi,

    ich benutze Code::Blocks als IDE und wollte gerade mein Programm kompilieren:

    #include <iostream>
    using namespace std;
    
    int main ()
    {
        cout << "Hello World!";
        return 0;
    }
    

    Nur gibt er mir folgende Fehler:

    bungsaufgaben\Speech Recognition\Aufgabe 1\1.c|1|error: iostream: No such file or directory|
    bungsaufgaben\Speech Recognition\Aufgabe 1\1.c|2|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'namespace'|
    bungsaufgaben\Speech Recognition\Aufgabe 1\1.c||In function 'main':|
    bungsaufgaben\Speech Recognition\Aufgabe 1\1.c|6|error: 'cout' undeclared (first use in this function)|
    bungsaufgaben\Speech Recognition\Aufgabe 1\1.c|6|error: (Each undeclared identifier is reported only once|
    bungsaufgaben\Speech Recognition\Aufgabe 1\1.c|6|error: for each function it appears in.)|
    ||=== Build finished: 5 errors, 0 warnings ===|
    

    Er erkennt also am Anfang nicht den Befehl für den Präprozessor und auch nicht den namespace??
    Habe mir die Version mit MingW runtergeladen. 🤡

    Piekst mir mal jemand in die Nase?
    mfG



  • Du versuchst scheinbar, eine Datei mit C++-Code als C-Datei zu kompilieren.
    Gib ihr die Endung .cpp und schau, ob dein Compiler sie dann auch als C++-Datei kompiliert.

    Außerdem ist es am Anfang eine schlechte Idee, sich auf eine IDE zu verlassen, ich rate dazu, einen einfachen Texteditor und weit verbreiteten Compiler, z.B. vim und GCC, zu nutzen, so lernst du von Anfang an deinen Code besser kennen.



  • Dankeschön! Es war richtig.

    Ich habe nun noch eine Datei erstellt, also einen neuen Sourcecode, aber der war auch wieder mit der Endung .c.
    Dazu bin ich auf File -> New -> Empty File.
    Kann ich es irgendwie hinbekommen, dass ich automatisch eine .cpp-Datei bekomme??

    Danke im Voraus 🙂

    edit : Ich umgehe es einfach, indem ich zukünftig manuell .cpp hinter den Dateinamen schreibe.



  • Dyvone schrieb:

    Dankeschön! Es war richtig.

    Ich habe nun noch eine Datei erstellt, also einen neuen Sourcecode, aber der war auch wieder mit der Endung .c.
    Dazu bin ich auf File -> New -> Empty File.
    Kann ich es irgendwie hinbekommen, dass ich automatisch eine .cpp-Datei bekomme??

    Edit: Ach, so meinst du das. Nein, du musst schon beim Angeben des Dateinamens einfach eine C++-Source Endung nutzen (.cc, .c++, .cxx, .cpp, ...).



  • Dann macht er nur .c.
    Ich glaube Code::Blocks und ich werden keine Freunde.

    Ein weiteres Problem:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        for(int i=0; i<=5; i++ )
        {
            cout << "\nHello World!";
        }
        return 0;
    }
    

    Was ja nur 5x Hello World! schreiben soll, aber er meckert wieder rum:

    l.5|multiple definition of `main'|
    l.5|first defined here|
    ||=== Build finished: 2 errors, 0 warnings ===|
    

    Ich mag diese unpräzise Errormeldung "first defined here|" nicht. Ich weiß nicht mal, was er mir damit sagen will. Und wo ist main bitte mehrfach definiert?

    mfG



  • Dyvone schrieb:

    Was ja nur 5x Hello World! schreiben soll, aber er meckert wieder rum:

    Zähl' noch mal nach.

    Dyvone schrieb:

    Und wo ist main bitte mehrfach definiert?

    Irgendwo in deinem Projekt...



  • Du hast vermutlich mehrere Dateien mit einer main-Funktion in einem Projekt.



  • Dyvone schrieb:

    Ich mag diese unpräzise Errormeldung "first defined here|" nicht.

    Was bitte ist daran unpräzise? Ganz klare Aussage: Zuerst hier definiert, dann (s. o.) hier redefiniert. Es heißt übrigens Fehlermeldung.

    Außerdem wirst du dich wohl damit abfinden müssen. Das hat nichts mit Codeblocks zu tun, sondern ist die Ausgabe vom GCC.



  • Oh mann oh mann oh manno mann.

    Sorry Leute. Habe gerade eben voll auf dem Schlauch gestanden. Hab nicht mitgedacht, als ich alle sourecodes in ein projekt gelegt habe...

    Danke 🙂



  • Benutze einfach keine IDE, die Dinger sind wie Krebs für Neulinge.



  • Du meinst nur mit der Konsole??



  • wenn du magst, kannst du mit vim, GCC und Valgrind/GDB komplett in der BASH arbeiten, dagegen spricht nichts. Aber es gibt auch gute GUI-Editoren wie z.B. gedit.



  • Ich hab noch nie mit Bash gearbeitet...

    zurzeit benutze ich wie gesagt Code::Blocks.

    ich hab noch eine Frage: Wie gebe ich einen String aus und dann eine Rechnung?
    ich machs so, ist aber fehlerhaft:

    cout << "\nThe sum is: " << sum = a+b+c+d+e;
    cout << "\nThe average of the numbers is: " << average = sum/5;
    

    Dabei sind die variablen oben definiert:

    int a,b,c,d,e;
    int average(0), sum(0);
    

    int a,b,c,d,e werden mit cin >> eingelesen.

    mfG



  • Dyvone schrieb:

    Ich hab noch nie mit Bash gearbeitet...

    zurzeit benutze ich wie gesagt Code::Blocks.

    ich hab noch eine Frage: Wie gebe ich einen String aus und dann eine Rechnung?
    ich machs so, ist aber fehlerhaft:

    cout << "\nThe sum is: " << sum = a+b+c+d+e;
    cout << "\nThe average of the numbers is: " << average = sum/5;
    

    Dabei sind die variablen oben definiert:

    int a,b,c,d,e;
    int average(0), sum(0);
    

    int a,b,c,d,e werden mit cin >> eingelesen.

    mfG

    Einfach in Klammern setzen. Shift-Operatoren werden vor dem Zuweisungsoperator ausgewertet.



  • Darf ich dich bitten, mir das etwas genauer zu erklären?



  • Hacker schrieb:

    Shift-Operatoren werden vor dem Zuweisungsoperator ausgewertet.

    Nö. Was operator precedence bedeutet, musst du nochmals nachlesen. :p

    @Dyvone:

    cout << "\nThe sum is: " << (sum = a+b+c+d+e);
    


  • Danke. Jetzt funktioniert alles so wie ichs haben wollte.

    http://www.amazon.de/Pearson-Education-GmbH-Einstieg-Anspruchsvolle/dp/3827361486

    Könnt ihr das empfehlen als Lehrwerk?



  • Dyvone schrieb:

    Darf ich dich bitten, mir das etwas genauer zu erklären?

    Natürlich 🙂

    Shift-Operatoren sind << , >> , <<= und >>= . Sie werden vor dem Zuweisungsoperator (=) ausgewertet und haben sozusagen eine höhere Rangfolge. Aus diesem Grund muss der Ausdruck in Klammern, da nur so zuerst der Zuweisungsoperator und dann der Shift-Operator ausgewertet wird.

    Wenn du den Ausdruck nicht in Klammern setzt, steht schlussendlich (!) folgendes da:

    std::cout = a;
    

    o.ä. was natürlich nicht geht, da der Zuweisungsoperator für std::ostream oder Basisklassen nicht überladen wurde - aber ich schweife ab.



  • Dyvone schrieb:

    Danke. Jetzt funktioniert alles so wie ichs haben wollte.

    http://www.amazon.de/Pearson-Education-GmbH-Einstieg-Anspruchsvolle/dp/3827361486

    Könnt ihr das empfehlen als Lehrwerk?

    Nein.



  • Schade. Ich lerne gern durch Zuhöhren. Aber lesen ist auch nicht schlecht, eig. sogar noch produktiver.

    Könnt ihr mir das ewiggroße Buch "C++ von A bis Z" empfehlen?

    Es hat alleine schon 104 Seiten Grundlagen...


Anmelden zum Antworten