C/C++



  • Was meint ihr angenommen ihr gerade Programmiert gerade etwas in C++ aber ihr wisst den C++ Befehl nicht den ihr gerade braucht.

    Aber zu Glück habt ihr ja auch mal C gemacht ^^ Und euch fällt der C Befehl ein.
    Also nehmt ihr dann halt den. ^^

    Also kurz gesagt hat es nachteile wenn man im C++ Source Code ein paar C Sachen drin hat ?

    Wenn man z.b. nur eine ausgabe machen will.

    So wie hier z.b.:

    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    
    int eingabe;
    printf("Eingabe; ");
    cin>>eingabe;
    
    printf("%d",eingabe);
    
    return 0;
    }
    //---------------------------------------------------------------------------
    

    ob ich das jetzt mit printf oder cout ausgeben ist ja hier egal den es funktioniert ja^^



  • C/C++ schrieb:

    Was meint ihr angenommen ihr gerade Programmiert gerade etwas in C++ aber ihr wisst den C++ Befehl nicht den ihr gerade braucht.

    kann gar nicht passieren, denn weder in C noch in C++ gibt es "Befehle".
    sollte ich doch einmal nicht wissen, welche Klasse, Funktion oder Methode ich brauche, um voranzukommen, schaue ich in die Dokumentation

    Also kurz gesagt hat es nachteile wenn man im C++ Source Code ein paar C Sachen drin hat ?

    kurz gesagt: ja

    ob ich das jetzt mit printf oder cout ausgeben ist ja hier egal den es funktioniert ja^^

    nein, in deinem Trivialbeispiel mag es egal erscheinen, aber printf bietet genügend gefahren und stolperfallen, vorallem da es nicht typsicher ist.



  • ok ty wieder was gelernt 🙂



  • Xantus schrieb:

    ob ich das jetzt mit printf oder cout ausgeben ist ja hier egal den es funktioniert ja^^

    nein, in deinem Trivialbeispiel mag es egal erscheinen, aber printf bietet genügend gefahren und stolperfallen, vorallem da es nicht typsicher ist.

    dafür funktioniert 'cout' nicht richtig. dann doch besser 'printf'
    🙂



  • -fricky- schrieb:

    dafür funktioniert 'cout' nicht richtig.

    wie meinen?



  • Xantus schrieb:

    -fricky- schrieb:

    dafür funktioniert 'cout' nicht richtig.

    wie meinen?

    probier dies:

    #include <iostream>
    using namespace std;
    
    volatile int *i = (volatile int*)123;
    
    int main()
    {
      printf ("%d\n", i);  // OK
      cout << i << endl;   // huch?
    }
    

    🙂



  • -fricky- schrieb:

    probier dies:

    #include <iostream>
    using namespace std;
    
    volatile int *i = (volatile int*)123;
    
    int main()
    {
      printf ("%d\n", i);  // OK
      cout << i << endl;   // huch?
    }
    

    Typfehler/Formatfehler bei der printf Funktion.



  • warning C4800: 'volatile int *': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt (Auswirkungen auf Leistungsverhalten möglich)

    😞



  • -fricky- schrieb:

    printf ("%d\n", i);

    perfektes beispiel warum printf böse ist.



  • Sowohl C als auch C++ haben verloren in diesem Beispiel 👎



  • ~john schrieb:

    Typfehler/Formatfehler bei der printf Funktion.

    bei printf wäre %p richtig, aber da zeigt er eine hexzahl an. ich wollte aber die '123' haben. aber printf macht keine '1' daraus. das schafft nur 'cout'.
    🙂



  • Zeus schrieb:

    warning C4800: 'volatile int *': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt (Auswirkungen auf Leistungsverhalten möglich)

    sowas das ist aber nicht in ordnung. seit wann darf ein compiler meinen code auslegen, wie's ihm in den kram passt? zumal da ein fetter cast drin ist.
    🙂



  • -fricky- schrieb:

    ~john schrieb:

    Typfehler/Formatfehler bei der printf Funktion.

    bei printf wäre %p richtig, aber da zeigt er eine hexzahl an. ich wollte aber die '123' haben. aber printf macht keine '1' daraus. das schafft nur 'cout'.
    🙂

    Tja, die klugen Leute erkennen damit das Problem - die unklugen wohl nicht.
    In der Tat liegt das Problem darin, dass du einfach etwas falsches machst: die Adresse einer Variablen bekommt man über %p in printf und cast nach void* in cout.

    Einfach korrekten Code schreiben und es geht.



  • Nein, cout hat kein <<(volatile int *), deswegen wird der nächst passende genommen und impilizit konventiert.



  • Shade Of Mine schrieb:

    die Adresse einer Variablen bekommt man über %p in printf und cast nach void* in cout.

    ohne das 'volatile' kann cout die adresse aber ausgeben.

    Zeus schrieb:

    Nein, cout hat kein <<(volatile int *), deswegen wird der nächst passende genommen und impilizit konventiert.

    wäre nicht ein fehler beim compilieren sinnvoller, als einfach das 'nächst passende' zu nehmen? vor allem passt das, angeblich nächste passende, überhaupt nicht.
    🙂



  • -fricky- schrieb:

    wäre nicht ein fehler beim compilieren sinnvoller, als einfach das 'nächst passende' zu nehmen? vor allem passt das, angeblich nächste passende, überhaupt nicht.
    🙂

    ja, aber printf macht es genauso.

    nur dass printf dabei abstürtzen kann und cout halt warnt dass es nicht weiss was du von ihm willst.



  • Shade Of Mine schrieb:

    nur dass printf dabei abstürtzen kann und cout halt warnt dass es nicht weiss was du von ihm willst.

    naja, bei printf kommt auch ein warning. und zwar ein ziemlich unmissverständliches:

    '%d' in format string conflicts with argument 1 of type 'volatile int *
    

    während die warnung beim 'cout':

    forcing value to bool 'true' or 'false' (performance warning)

    doch erstmal zum nachdenken anregt (lenkt z.b. vom eigentlichen problem ab durch den hinweis, dass die performance leiden könnte). abstürzen würden sie wohl beide, auf einem system, auf dem ein missratener lesezugriff solche auswirkungen hätte. mich erschüttert nur etwas diese konvertierung in ein 'boolean' und das damit verbundene 'aus 123 mach 1'. das könnte man schon als handfesten bug bezeichnen, der übrigens schon seit jahren drin ist. nur dass der alte MSVC dabei keinerlei warnung ausspuckte.
    🙂



  • -fricky- schrieb:

    mich erschüttert nur etwas diese konvertierung in ein 'boolean' und das damit verbundene 'aus 123 mach 1'. das könnte man schon als handfesten bug bezeichnen, der übrigens schon seit jahren drin ist. nur dass der alte MSVC dabei keinerlei warnung ausspuckte.
    🙂

    Nur, dass dies kein Bug ist! Eine Konvertierung volatile int* => void* ist aus gutem Grund verboten. Wäre sie erlaubt, dann würde sie auch bevorzugt werden. Ich bin mir ganz und gar nicht sicher ob

    printf("%p", (volatile int*)123);
    

    überhaupt legaler Code ist. Bei der Übergabe dürfte eine Konvertierung volatile int* => volatile void* stattfinden. In printf wird bei va_arg jedoch void* benutzt. Ich glaube nicht, dass va_arg vom übergebenen Typ abweichen darf.



  • cout versagt also wenn Machiavelli, err... -fricky- am Werk ist?
    Interessiert mich das?
    eher nicht.



  • -fricky- schrieb:

    forcing value to bool 'true' or 'false' (performance warning)

    doch erstmal zum nachdenken anregt (lenkt z.b. vom eigentlichen problem ab durch den hinweis, dass die performance leiden könnte). abstürzen würden sie wohl beide, auf einem system, auf dem ein missratener lesezugriff solche auswirkungen hätte. mich erschüttert nur etwas diese konvertierung in ein 'boolean' und das damit verbundene 'aus 123 mach 1'. das könnte man schon als handfesten bug bezeichnen, der übrigens schon seit jahren drin ist. nur dass der alte MSVC dabei keinerlei warnung ausspuckte.
    🙂

    Offensichtlich denkst du nicht nach, sondern willst nur trollen. Wenn irgendetwas am cout Fall zum Absturz führen könnte, dann die unsägliche Initialisierung des Zeigers, die du verbrochen hast.


Anmelden zum Antworten