Problem bei den ersten Schritte in C/C++



  • Hallo,
    ich bin gerade dabei C/C++ anhand des Buches "C/C++ Von den Grundlagen zur professionellen Programmierung" zu lernen.
    Ich habe den ersten Beispielscode eins zu eins in Eclipse unter Mac OS X eingeben und möchte ihn nun ausführen.
    Dabei treten jedoch schon die ersten Probleme auf.

    # include <stdio.h>
    # include <stdlib.h>
    
    main (){
    	int summe;
    	int a;
    	float b;
    
    	a = 123;
    	b = a;
    	summe = 2*a +3;
    }
    

    Dabei kommt folgende Fehlermeldung in der Konsole:

    Severity Description Resource In Folder Location Creation Time Id
    1 control reaches end of non-void function main.c kapitel1 line 12 24. Mai 2006 17:02:33 12
    1 return type defaults to `int' main.c kapitel1 line 4 24. Mai 2006 17:02:33 11

    Nun gut, dann hab ich den Code in

    # include <stdio.h>
    # include <stdlib.h>
    
    int main (){
    	int summe;
    	int a;
    	float b;
    
    	a = 123;
    	b = a;
    	summe = 2*a +3;
    }
    

    geändert, doch dann bleibt nur noch folgende Fehlermeldung übrig:

    Severity Description Resource In Folder Location Creation Time Id
    1 control reaches end of non-void function main.c kapitel1 line 12 24. Mai 2006 17:09:14 13

    Kann mir jemand helfen?



  • nimm mal die includes raus (brauchst du für das beispiel nicht) und füg mal am ende von der Datei eine leerzeile an, das is c++-standard 🙂
    vielleiht hilfts...

    edit: ah!
    du musst vor } noch return 0; schreiben wahrscheinlihc



  • robind schrieb:

    Hallo,
    ich bin gerade dabei C/C++ anhand des Buches "C/C++ Von den Grundlagen zur professionellen Programmierung" zu lernen.
    Ich habe den ersten Beispielscode eins zu eins in Eclipse unter Mac OS X eingeben und möchte ihn nun ausführen.
    Dabei treten jedoch schon die ersten Probleme auf.

    # include <stdio.h>
    # include <stdlib.h>
    
    main (){
    	int summe;
    	int a;
    	float b;
    	
    	a = 123;
    	b = a;
    	summe = 2*a +3;
    }
    

    Dabei kommt folgende Fehlermeldung in der Konsole:

    Severity Description Resource In Folder Location Creation Time Id
    1 control reaches end of non-void function main.c kapitel1 line 12 24. Mai 2006 17:02:33 12
    1 return type defaults to `int' main.c kapitel1 line 4 24. Mai 2006 17:02:33 11

    Nun gut, dann hab ich den Code in

    # include <stdio.h>
    # include <stdlib.h>
    
    int main (){
    	int summe;
    	int a;
    	float b;
    	
    	a = 123;
    	b = a;
    	summe = 2*a +3;
    }
    

    geändert, doch dann bleibt nur noch folgende Fehlermeldung übrig:

    Severity Description Resource In Folder Location Creation Time Id
    1 control reaches end of non-void function main.c kapitel1 line 12 24. Mai 2006 17:09:14 13

    Kann mir jemand helfen?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void){
    	int summe;
    	int a;
    	float b; /* das benutzt du eh nicht */
    
    	a = 123;
    	b = (float) a;  /* int in float umwandeln*/
    	summe = 2*a +3;
            return 0;
    }
    


  • also 1.:Ich kann zwischen den beiden Codes keinen Unterschied erkennen!
    2.: Wofür soll "b" gut sein ?
    3.: Mach mal nach der geschweiften Klammer ein semikolon
    Hoffe das hilft ein bisschen
    Gruß Corporation ®®®®®



  • Corporation schrieb:

    3.: Mach mal nach der geschweiften Klammer ein semikolon

    ??? ; ???



  • Mann was ein Gefrickel hier heute...

    1. Lernst Du nun C oder C++? Die Sprache C/C++ gibt es nicht.
    2a. Falls C++, war der Code (mit int main) syntaktisch vollkommen in Ordnung.
    2b. Falls C, muss da wirklich ein return 0 hin
    3. Semikolon nach der geschweiften Klammer ist Quatsch
    4. Auf ne fehlende Leerzeile am Ende hat keine Fehlermeldung hingewiesen, ist im Übrigen auch Quatsch, die letzte Zeile muss nur mit einem Zeilenende abgeschlossen sein.

    Und so sollte es auf jeden Fall klappen:

    /* C-Code folgt */
    #include <stdio.h>
    
    int main (void) {
        int a = 123;
        int summe = 2*a +3;
        printf("%d\n", summe);
        return 0;
    }
    
    // Und als C++-Code:
    #include <iostream>
    using namespace std;
    
    int main () {
        int a = 123;
        int summe = 2*a +3;
        cout << summe << endl;
    }
    


  • Corporation schrieb:

    also 1.:Ich kann zwischen den beiden Codes keinen Unterschied erkennen!

    Der Unterschied ist einmal, daß ein Rückgabetyp angegeben wurde (unter C ist int zwar der Default, aber darauf sollte man sich nicht verlassen) und bei TGGC's Lösung das "return 0;" am Ende (obwohl - laut ANSI Standard darf main() auch implizit verlassen werden).

    3.: Mach mal nach der geschweiften Klammer ein semikolon

    Wozu soll das gut sein?



  • LordJaxom schrieb:

    ...

    // Und als C++-Code:
    #include <iostream>
    using namespace std;
    
    int main () {
        int a = 123;
        int summe = 2*a +3;
        cout << summe << endl;
    }
    

    Echt ? 😮
    Der meckert kein fehlendes return an ? (Bei mir auch nicht, hab's gerade ausprobiert)

    Standard, Kap.3.6.1.5 schrieb:

    "... if control reaches the end of main without encountering a return statement, the effect is that of executing return 0. ..."

    😮 😮 😮
    Wieder mal etwas ganz Neues - was mal wieder beweist, dass es sich lohnt, auch in Threads reinzulesen, deren Thema einen erstmal nicht fesselt.
    👍

    Gruß,

    Simon2.



  • Mann o Mann.

    Die Frage von dem User ist ja auch schon ein halbes Jahr alt. :xmas1:

    Aber egal.

    Nur mal eine kleine Frage so am Rande.
    Ich muss den Quelltext am Schluß mit den beiden Befehlen

    char p[50];
        cin.getline (p,50);
    

    versehen, da ansonsten das Konsolenprogramm sofort geschlossen wird.
    In Eurem C++-Code sehe ich davon aber gar nichts... Wieso???

    Gruß
    Lurchie :xmas2:



  • Weil unsere Beispielprogramm sich normalerweise auf das Wesentliche an einem Problem konzentrieren (und dazu gehören üblicherweise nicht die Probleme deiner Konsole).

    PS: Schau mal in die FAQ des Konsolen-Boards, dort findest du elegantere Lösungen dafür.

    PPS: woher hast du eigentlich die '50'?



  • Lurchie schrieb:

    In Eurem C++-Code sehe ich davon aber gar nichts... Wieso???

    Einfache Antwort: Weil ein (Konsolen-)Programm nach Erledigung seiner Arbeit den User nicht noch weiter belästigen muss 😃



  • Wenn ich ehrlich bin, ist das eine sehr gute Frage.

    Kann ich leider nicht wirklich beantworten. Ich habe auch erst vor
    ca. 1 1/2 Monaten mit C++ angefangen, ein sogenanntes Fernstudium.

    In den Studienheften steht jedesmal dieser Befehl so drin.
    Eine genaue Erläuterung warum gerade eine "50" drin stehen soll, hab
    ich bis heute nicht erhalten (oder ich hab es überlesen 😕 ).
    Bis heute ist mir leider auch noch keine andere Möglichkeit bekannt,
    damit die Konsole nicht sofort geschlossen wird.

    Gruß

    Lurchie :xmas2:

    P.S. Jetzt weiss ich wenigstens das Ihr Euch auf's wichtige beschränkt! 😉



  • LordJaxom schrieb:

    Einfache Antwort: Weil ein (Konsolen-)Programm nach Erledigung seiner Arbeit den User nicht noch weiter belästigen muss 😃

    Dann wäre ja die einzige logische Schlussfolgerung für ein "funktionierendes" Programm keine Fehlermeldung vom Compiler. Verstehe ich das Richtig???

    Okay, jedem das Seine! 🕶



  • Lurchie schrieb:

    Bis heute ist mir leider auch noch keine andere Möglichkeit bekannt,
    damit die Konsole nicht sofort geschlossen wird.

    Dann lies dir mal diesen Beitrag durch, da stehen ein paar Alternativen.

    Lurchie schrieb:

    LordJaxom schrieb:

    Einfache Antwort: Weil ein (Konsolen-)Programm nach Erledigung seiner Arbeit den User nicht noch weiter belästigen muss 😃

    Dann wäre ja die einzige logische Schlussfolgerung für ein "funktionierendes" Programm keine Fehlermeldung vom Compiler. Verstehe ich das Richtig???

    Nein, außerdem sollte es auch noch die Aufgabe korrekt erfüllen, die der Autor gestellt hat.



  • Vielen Dank für den Hinweis.

    Werde ich mir gleich mal zu gemühte führen, damit ich meinen Horizont erweitern kann.



  • Die Schwierigkeit ist ja die, das ein HelloWorld! nicht davon ausgehen kann, das es in einem temporären Fenster gestartet wird, welches sich bei Programmende auch noch schliesst. Was ist wenn man das Programm aus einer dauerhaften bereits geöffneten Konsole startet??? Dann ist diese Tastenabfrage zum Schluss einfach nur witzlos.

    Bei VisualC++ 2003 (wird auch beim 2005er so sein) beendet sich die Konsole z.B. nicht sofort, wenn ich ein HelloWorld Programm aus der IDE starte. Da kommt nämlich zum Schluss ein "Press any key to continue", welches ich nicht eingebaut habe!!!

    Also, warum soll in einem HelloWorld eine Bestätigung am Ende kommen?



  • Artchi schrieb:

    Was ist wenn man das Programm aus einer dauerhaften bereits geöffneten Konsole startet??? Dann ist diese Tastenabfrage zum Schluss einfach nur witzlos.

    Da stimme ich Dir ja auch zu. In diesem Fall ist es witzlos...

    Artchi schrieb:

    Bei VisualC++ 2003 (wird auch beim 2005er so sein) beendet sich die Konsole z.B. nicht sofort, wenn ich ein HelloWorld Programm aus der IDE starte. Da kommt nämlich zum Schluss ein "Press any key to continue", welches ich nicht eingebaut habe!!!

    Kann in diesem Fall leider nicht mitreden da ich den Borland C++ Builder 6.0 benutze und da kommt dieser Hinweis leider nicht.
    Aber schließlich geht es nicht um ein HelloWorld-Programm, sondern um die Tatsache das sich die Konsole nicht einfach schließt, wenn ich dies auch nicht möchte.

    Gruß

    Lurchie :xmas2:



  • Artchi schrieb:

    Bei VisualC++ 2003 (wird auch beim 2005er so sein) beendet sich die Konsole z.B. nicht sofort, wenn ich ein HelloWorld Programm aus der IDE starte. Da kommt nämlich zum Schluss ein "Press any key to continue", welches ich nicht eingebaut habe!!!

    Das ist in VS 2005 definitiv nicht der Fall, was einfach nur über-idiotisch ist. Schon deswegen, weil man in einem Einführungstutorial im ersten Quellcode (!) sowas wie 'std::cin.rdbuf()->in_avail()' ... erwähnen muss, was natürlich niemand versteht.

    Ärgerlich, sehr ärgerlich.



  • Konrad Rudolph schrieb:

    Das ist in VS 2005 definitiv nicht der Fall,

    Nicht ganz korrekt. Wenn Du das Projekt mit der Play-Taste (Debug) startest, passiert so etwas tatsächlich nicht. Aber starte dasselbe Projekt mal mit dem Menüpunkt "Starten ohne Debuggen". Siehe da: "Drücken Sie eine beliebige Taste..."

    Ziemlich idiotisch das, oder? 😉



  • Weil man vielleicht beim Debug-Starten davon ausgeht, das man irgendwo einen Breakpoint gesetzt hat? Keine Ahnung. Aber ich starte meistens mit Strg+F5 (Run) und meine Konsolenprogramme bringen am Ende enstprechende Tastenabfrage.


Log in to reply