Fragen rund um C++



  • Swordfish schrieb:

    DerBoss schrieb:

    // Template – stellt eine Schablone zur Verfügung, die als
    // Ausgangspunkt verwendet wird
    //
    // Die folgenden Include-Dateien definieren die Mehrzahl der
    // Funktionen, die von allen Programmen benötigt werden.
    #include <iostream>
    #include <stdio.h>
    #include <windows.h>
    #include <winable.h>
    #include <conio.h>
    #include <ctime>
    using namespace std;
    

    Yeah, ymmd! 👍

    Ach, daher kommt die Unsitte, die ich vermehr bei Anfängern finde, erstmal tauschen unnötige Includes zu machen.
    Fürchte auch, das Buch wird uns noch schwer beschäftigen.



  • Wenn das die letzte Ausgabe von "C++ for Dummys" ist, die online in englisch verfügbar ist?

    Dann zeigen die bei den meisten Beispielen nur 3 Header 😉
    Hier mal kopiert:

    #include <cstdio> 
    #include <cstdlib> 
    #include <iostream> 
    using namespace std;
    

    Ich hoffe mal das sind die passenden Code-Tags 😕

    Wenn man vor ein paar Jahren die Header da ohne System zur "Sicherheit" eingebaut hatte, konnte man sich schwer zu findende Fehler einfangen. Das haben die Compileranbieter heute ja meist im Griff.

    MfG f.-th.


  • Mod

    volkard schrieb:

    Ach, daher kommt die Unsitte, die ich vermehr bei Anfängern finde, erstmal tauschen unnötige Includes zu machen.
    Fürchte auch, das Buch wird uns noch schwer beschäftigen.

    Du hast, glaube ich, bei deiner Auszeit die neueste Variante, den Superheader, gar nicht mitbekommen. Die ist im letzten Jahr ungefähr alle 2-3 Wochen hier aufgetaucht.



  • ok, diese ganzen restlichen include dateiene habe ich aus dem internet, da waren weniger angegeben, aber ich dachte je mehr desto besser und so.... 😃 schadt das jetzt oder nicht...
    also muss ich in case 2 das int weglassen(, jetzt mal in klammern gesetzt )bzw geht das mit diesem gnu compiler (win7 64-bit) jetzt oder nicht?

    case 2:
            (int) nName , nSpezies ;
            cout <<"PC: Hallo, wer bist du?\n"
                <<"Du: Ich bin: "
                <<endl;
            cin >> nName;
            cout <<"PC: Hallo," << nName <<" ich bin ein Computer!\n"
                <<"PC: Was für eine Spezies bist du?\n"
                <<"Du: Ich bin ein/e/er:  "
                <<endl;
            cin >> nSpezies;
            cout <<"PC: Was für eine niedere Rasse..:D\n"
                <<"PC: Tschüss du" << nSpezies <<"! Ich muss weg!"
                << endl;
            break;
    

    also das probelm ist dabei (case 2) , ich kann bei nName schon was eingeben nur dann verwendet der Coputer das nicht weiter und sprigt gleich bis zum Ende...

    1. Meinst du eine Schleife? Also, dass der Code immer und immer wieder ausgeführt wird?
    

    nein ich schleifen waren bis dahin schon erklärt mir while und for und so..ich will, dass das zum anfang, also zum wählen zurückspringt.... 😃

    aus dem internet hab ich auch so ne lsite mit befehlen und da stand:

    cerr << ”Fehlermeldung”;	(iostream.h)	Auf cerr werden Fehlermeldungen geschickt. (auf den Bild-
    			schirm normalerweise, das kann man aber ändern)
    

    das sollte eben so ne fehlermeldung sein, ich dachte man braucht nur diesen befehl...
    trotzdem danke für die antworten
    ps: das buch hab icn von amazon, da es dort die besten bewertung in sachen verständlichtkeit und anfängererklärung und so hatte...:)


  • Mod

    DerBoss schrieb:

    (int) nName , nSpezies ;
    

    Ich habe jetzt nicht den ganzen Thread durchgelesen, aber wenn dir jemand gesagt hat, du sollst da Klammern drum machen, dann hast du da etwas falsch verstanden.

    ps: das buch hab icn von amazon, da es dort die besten bewertung in sachen verständlichtkeit und anfängererklärung und so hatte...

    http://xkcd.com/937/

    Du solltest dir auch schnellstens abgewöhnen, Code aus dem Internet zusammen zu kopieren. Du musst verstehen was du tust, sonst produzierst du bloß zufälligen Zeichenmüll wie die obige Zeile, die sich zwar möglicherweise übersetzen lässt, aber völliger Unsinn ist. Schnapp dir lieber dein Buch und lies mal nach, was dieses über Gültigkeitsbereiche zu sagen hat. Ich vermute mal, selbst ein Buch mit solch einem Titel wird nicht soooo schlecht sein, dass das da drin nicht ausreichend erklärt ist.

    Dein Problem bezüglich der Eingabe kann ich nicht nachvollziehen, insbesondere weil dein Programm eigentlich gar nicht übersetzbar sein dürfte. Welchen Code benutzt du denn gerade? Generell gilt: Computer machen niemals Fehler und sie machen auch keine eigenständigen Aktionen. Sie machen genau das was du sagst und sei es auch noch so sinnlos. Der Fehler liegt also auf jedem Fall in deinem Programm, nicht daran, dass dein Computer dich ärgern möchte. Meistens sind scheinbar "übersprungene" Eingaben auf Anfängerfehler bei der Mischung von getline und operator>> zurück zu führen, jedoch sehe ich nur operator>> in deinem Programm, also wird es daran nicht liegen. Daher: Code zeigen!



  • nien das mit den klammern war nur so um zu zeigen was ich wegmachen soll....:)
    ich benutze c++ und der compiler übersetzt den ohne probleme nur laufen tut der nicht wie der soll...:( kopiert habe ich nur die include zeilen da und weche zeile macht jetzt keiene sinn? 😃



  • Nein, du musst Klammern (geschweifte) nach dem case und vor dem nächsten setzen.
    Die Funktion displayExplanation ist übrigens überflüssig. Code kannst du einfach in main einfügen.
    Der Grund warum der Dialog nicht klappt, ist, dass du versuchst in Integer einen String zu speichern, verwende bitte std::string (string includen). Als Header brauchst du auch nur iostream und string, die anderen sind Schwachsinn (in diesem Fall).



  • sorry soweit bin ich nocht nicht, also fast alle include dateien raus, string dazu, eigtl muss doch auch windows.h oder so dazu sonst funktioniert das

    system("PAUSE"
    

    ) nicht...also einfach statt

    int nName , nSpezies ;
    

    einfach

    std::string nName , nSpezies ;
    

    soweit habe ich das verstanden...:D
    is aber falsch oder?


  • Mod

    DerBoss schrieb:

    std::string nName , nSpezies ;
    

    Interessant, wie du gerade selbstständig entdeckst, wieso ungarische Notation in C++ eher unbeliebt ist.

    is aber falsch oder?

    Dies lässt sich anhand der von dir gelieferten Informationen nicht beantworten. Was soll falsch sein und warum? Hast du die anderen oben genannten Fehler schon korrigiert?



  • Die system Funktion solltest du auch nicht verwenden!
    Ersetze sie durch

    cin.ignore(numeric_limits<char>::max(), '\n'
    cin.get();
    

    Dafür musst du auch limits includen.
    Macht das gleiche wie system("PAUSE"), wartet auf einen Tastendruck.
    Ansonsten ist es aber in Ordnung.

    Edit:
    @Sepp:
    Und den Ersatz für using namespace std.


  • Mod

    Nathan schrieb:

    cin.ignore(numeric_limits<char>::max(), '\n'
    cin.get();
    

    char?



  • Äh, natürlich streamsize. Ich sollte manchmal vielleicht nachdenken bevor ich schreibe... 😃

    Edit: std::cin.sync() müsste doch eigentlich auch gehen oder?



  • Nathan schrieb:

    Äh, natürlich streamsize. Ich sollte manchmal vielleicht nachdenken bevor ich schreibe... 😃

    Edit: std::cin.sync() müsste doch eigentlich auch gehen oder?

    Kann gehen muss nicht. Sind glaub schon viele damit die Schnautze gefallen. Glaub es ist implementierungsabhängig.



  • wenn ich das da aber ersetzt (das

    sytem("PAUSE")
    

    )
    durch

    cin.ignore(numeric_limits<char>::max(), '\n'
    cin.get();
    

    bzw

    cin.ignore(numeric_limits<streamsize>::max(), '\n'
    cin.get();
    

    kommen beiM Build die fehler hier:

    error espected primary expression before '<' token
    
    error: no matching function to call to max()
    
    error : 'numeric_limits' was not declared in this scope
    
    error: expected '(' before 'cin'
    

    was soll ich dagegen tun, das mit den messageboxes funktioniert übrigens einwandfrei, danke für den hinweis 🙂
    das mit dem string und so hab ich net verstanden der dialog funktioniert immer noch nicht 😞 vllt ein beispiel bitte...
    😃 😃
    EDIT: dieses forum wurde hinten im buch für fragen empfohlen und ich muss sagen bis auf jeden fall antworten leute hier sinnvolle sachen und einem wird geholfen. 😃



  • Hast du #include <limits>?
    Was klappt den am Dialog nicht?



  • Wo wird numeric_limits denn deklariert? Fehlt diese Deklaration vielleicht in dieser Übersetzungeinheit?



  • ok danke hab vergessen das zu includen...:)
    also bei dem dialog sollte das so sein, dass ich meinen Namen eingebe und der PC den weiterverwendent....
    das kommt: http://www.bilderhoster.net/1/dlmwzty7.png.php
    http://www.bilderhoster.net/1/tfwty4c1.png.php
    so sollte es nicht sein..hier nochmal der code dazu:

    case 2:
            {
            int nName ;
            int nSpezies ;
            cout <<"PC: Hallo, wer bist du?\n"
                <<"Du: Ich bin: "
                <<endl;
            cin >> nName;
            cout <<"PC: Hallo," << nName<< ", ich bin ein Computer!\n"
                <<"PC: Was für eine Spezies bist du?\n"
                <<"Du: Ich bin ein/e/er:  "
                <<endl;
            cin >> nSpezies;
            cout <<"PC: Was für eine niedere Rasse..:D\n"
                <<"PC: Tschüss du" << nSpezies <<"! Ich muss weg!"
                << endl;
            break;
            }
    

    welche includes kann ich jetzt löschen?

    #include <iostream>
    #include <string>
    #include <windows.h>
    #include <winable.h>
    #include <conio.h>
    #include <ctime>
    #include <limits>
    using namespace std;
    

    und nochmal die frage: wie schaffe ich es das ich von den cases wieder zu der auswahl komme, also das programm dann nicht gelich beendet wird...system("PAUSE") hab ich jetzt übrigens rausgenommen...und die message boxen klappen auch, danke schonmal dafür...:D
    DerBoss 😃



  • Wo verwendest du den die MessageBoxen?
    Raus kann ctime, conio, winable.
    Und nName und nSpezies müssen strings sein...



  • DerBoss schrieb:

    welche includes kann ich jetzt löschen?

    #include <iostream>
    #include <string>
    #include <windows.h>
    #include <winable.h>
    #include <conio.h>
    #include <ctime>
    #include <limits>
    

    Probier's doch zeilenweise aus.



  • Ich glaube ich sage zuviel, oder? @volkard

    Das mit der Auswahl, packe das komplette Menü (also dein ganzes Programm) in eine Endlossschleife, bei einem neuen Menüpunkt exit wird die verlassen und das Programm beendet.


Anmelden zum Antworten