scanf kickt mich aus dem Programm raus...



  • SeppJ schrieb:

    Es ist nichts schlechtes daran, für sich selber einen Namensraum irgendwo komplett auszuschütten.

    Ja, aber Anfängern wird oft vermittelt: Scheiß auf std::, schütte es einfach in jedem Projekt in der main() und in allen Headern aus - und mehr wird nicht gesagt. Das ist sehr schade. Ich finde, man sollte using namespace ...; wie dynamische Speicherallokierung durch new & delete erst als Zusatz lernen, und nicht als Selbstverständlichkeit.



  • Hoppla, jetzt verstehe ich gar nichts mehr! 😃

    Ich habe mir den Code aus verschiedenen Codes im Internet zusammengestellt und weiss eigentlich nicht genau was alle Befehle bedeuten!

    Das using namespace scheint ja wichtig zu sein 🙂 könnte es mir bitte jemand kurz erklären?

    Und was ist denn std::cin >> drive;?
    Ich kenne eben nur die C Programmierung und bin kein Profi!

    Lg
    Rogon



  • rogon schrieb:

    Ich habe mir den Code aus verschiedenen Codes im Internet zusammengestellt und weiss eigentlich nicht genau was alle Befehle bedeuten!

    O.O

    Hast du sie noch alle!? So lernt man doch kein C++? Hol dir schnell ein gutes Buch! Viel, das im Internet steht ist schrott.
    C und C++ sind an sich völlig verschiedene Sprachen mit gleicher Syntax. Das verwirrt manchmal.



  • Hast du sie noch alle!? So lernt man doch kein C++?

    Naja, ich kenne das C++ ja fast nicht!
    Ich habe bisher nur das C gelernt 😃

    Was empfiehlst du mir beim C++ für ein gutes Buch?

    Und was sind denn das jetzt für Befehle?



  • rogon schrieb:

    Was empfiehlst du mir beim C++ für ein gutes Buch?

    Es gibt sehr viele.
    Extra dafür gibt es hier im Forum einen sog. Buchthread mit vielen guten Beiträgen zum Thema C++-Buch.

    Edit: Hier im FAQ (wo du auch öfter reinschauen solltest 😉 ).


  • Mod

    Was willst du denn jetzt überhaupt? C oder C++? Wie schon gesagt, hast du bisher C gelernt, aber durch dein

    Ich habe mir den Code aus verschiedenen Codes im Internet zusammengestellt und weiss eigentlich nicht genau was alle Befehle bedeuten!

    hast du versehentlich C++ eingebaut, was natürlich schief ging. Aber da du dein C anscheinend mit einem C++-Compiler übersetzt hast, war es zumindest grammatikalisch richtig, weswegen dieser sich nicht beschwert hat. Was natürlich auch schlecht ist, das sollte man nie machen.

    C und C++ sind wirklich sehr verschieden, sie haben bloß eine ähnliche Grammatik und manche Wörter sind gleich. Ungefähr so, wie wenn normale Leute mit Juristen reden. Man merkt zwar, dass die Sprache irgendwie ähnlich ist, aber man versteht nix und am Ende ist man sein Geld los.

    Wenn du jetzt anfängst, auf C++ umzusteigen, dann darfst/solltest du alles vergessen, was du bisher gelernt hast.



  • 314159265358979 schrieb:

    using-Direktiven sind manchmal sogar nötig, um ADL zu triggern.

    Bitte was?! Kannst Du bitte erklären, was Du mit diesem Satz meinst? So klingt das erstmal für mich nach einer falschen Aussage. Aber vielleicht missverstehe ich Dich ja auch ...



  • template <typename T>
    void foo(T& a, T& b)
    {
        std::swap(a, b); // kein ADL
    }
    
    template <typename T>
    void bar(T& a, T& b)
    {
        using std::swap;
        swap(a, b); // ADL
    }
    


  • rogon schrieb:

    Eigentlich dachte ich, dass C beim C++ abwärtskompatibel ist!
    [...]
    std::string drive;
    std::cin >> drive;
    [...]
    std::string drive;
    scanf ("%s", &drive);

    Im Wesentlichen fliegt Dir das hier um die Ohren, weil Du lügst. Wegen "%s" erwartet scanf eine Adresse vom Typ char* und nicht string*. Die Sprache an sich lässt so etwas zu, weil die Sache mit den variadischen Funktionen in C überhaupt nicht typsicher ist.

    Guck mal, ob Du bei Deinem Compiler so konfiguriert bekommst, dass er solche Sachen prüft und vor Missbrauch warnt. Die Funktionssignatur gibt zwar nicht genug Informationen her, um so etwas überprüfen zu können, aber da solche Fehler in C relativ prominent sind, hat der eine oder andere Compiler-Hersteller den Compilern den Zusammenhang zwischen dem Format-String und den folgenden Argumenten beigebracht.

    Alternativ: Lass die Finger von Sachen, die nicht typsicher sind.

    314159265358979 schrieb:

    template <typename T>
    void foo(T& a, T& b)
    {
        std::swap(a, b); // kein ADL
    }
    
    template <typename T>
    void bar(T& a, T& b)
    {
        using std::swap;
        swap(a, b); // ADL
    }
    

    Erstens ist das das keine using-Direktive sondern eine using-Deklaration.
    Zweitens triggerst Du hier nicht ADL per using-Deklaration sondern dadurch, dass das zweite swap unqualifiziert ist. Verbuchen wir das als ein Missverständnis.



  • krümelkacker schrieb:

    Erstens ist das das keine using-Direktive sondern eine using-Deklaration.

    Ist dem so? Was ist dann eine Direktive?

    krümelkacker schrieb:

    Zweitens triggerst Du hier nicht ADL per using-Deklaration sondern dadurch, dass das zweite swap unqualifiziert ist. Verbuchen wir das als ein Missverständnis.

    Strenggenommen ja. Aber ohne using würde die unqualifizierte Version nicht funktionieren...



  • Direktiven erkennst du am Schlüsselwort namespace . Also...

    using namespace dings; ist eine using-Direktive.
    using std::swap; ist eine using-Deklaration.

    Ersteres sorgt dafür, dass, falls die Namenssuche im globalen Scope angelangt ist, auch Namen aus dings berücksichtigt werden.

    Zweiteres führt den Namen einer Entität (Klasse, Funktion, etc, nur kein Namensraum) in den Scope ein, wo die using-Deklaration steht (typischerweise nicht der globale).



  • Aah! Ok, alles klar! 😉

    Ich möchte hier noch allen für die tollen Antworten danken!
    You Guys Rock! 😃 👍

    Liebe Grüsse
    Rogon



  • Hacker schrieb:

    Hol dir schnell ein gutes Buch! Viel, das im Internet steht ist schrott.

    Seit Du Dich hier austobst, wurde es noch mehr Schrott.
    Jeden Thread killst Du mit deinen Failtips. Macht keinen Spaß mehr hier zu lesen.



  • lolalter schrieb:

    Hacker schrieb:

    Hol dir schnell ein gutes Buch! Viel, das im Internet steht ist schrott.

    Seit Du Dich hier austobst, wurde es noch mehr Schrott.
    Jeden Thread killst Du mit deinen Failtips. Macht keinen Spaß mehr hier zu lesen.

    Mutig. Aber antstatt ihm eine Mail zu schreiben musst du hier noch weiterspammen... besser bist du auch nicht...


Anmelden zum Antworten