Ausgabe von Zahlen



  • Hallo zusammen.

    ich habe eine Frage zur Ausgabe von Zahlen, und den damit verbunden Unterschieden bei Betriebssystemen:

    die Zeile
    int a;
    unsigned int long long b,c,d;

    printf("Ausgabe: %llu;%llu;%llu;%llu\n", a,b,c,d);

    liefert mir auf einem Linux die entsprechend erwarteten Zahlen.

    Auf einem Windows erhalte ich für die Variablen b und d immer den Wert Null..

    Kann mir das jemand erklären, und mir sagen wie ich eine auf verschiedensten OSen portierbare Ausgabe erhalte?

    Danke und VG



  • Hast du die Zahlen überhaupt initialisiert? Ansonsten ist ihr Wert ja ohnehin undefiniert.

    Soweit ich weiß ist unsigned long long nicht in allen C Versionen vorhanden. Der Microsoft Visual C++ Compiler unstützt es in seiner C Version wohl nicht.



  • Ich vermute, dass es damit zusammenhängt, dass du einen int in %llu schmeißt. Versuch's mal mit "%d;%llu;%llu;%llu".

    Sonst liegt der Fehler irgendwo anders. Kannst du einen Testfall zusammenstellen, der das Problem reproduziert?



  • Folgendes habe ich gerade unter MSVC++ 2010 getestet:

    int main()
    {
    	int a;
    unsigned int long long b,c,d;
    
    a = 10;
    b = 100;
    c = 1000;
    d = 10000;
    
    printf("Ausgabe: %d;%llu;%llu;%llu\n", a,b,c,d); 
    }
    

    Ausgabe:

    Ausgabe: 10;100;1000;10000

    Also alles gut.



  • Die Angaben im Formatstring müssen schon mit den Parameter übereinstimmen.



  • Der Datentyp long long und Verwandte ist erst mit C99 eingeführt worden, d.h. C89 Compiler (wie MS C Compiler z.B.) brauchen ihn nicht zu kennen. Sie tun es aber teilweise doch, aber dann natürlich am (C99) Standard vorbei, indem sie wie MS C z.B. eigene Formatstrings für printf/scanf definieren. "llu" ist C99, bei MS C heisst es dann z.B. "I64lu", d.h. du kannst nicht mehr compilerunabhängig arbeiten.
    Mit Betriebssystemunterschieden hat das ganze aber nichts zu tun, das sind Compilerspezifiken.



  • Ok, ein konkretes Beispiel
    OS WinXP 32 Bit
    Ausgeführt mit Dev-C 4.9.9.2

    int main()
    { int a; 
    uint64_t b,c,d; 
    a=10; 
    b=13893804298LLU; //Das LLU brauche ich schon mal explizit in Windows. Wie vermeide ich dasd? 
    c=2082383084404LLU; 
    d=9728731831289LLU; 
    for (int i = 0; i <= 1000000; i )
    { 
    printf(\\\"# %d %llu %llu %llu\\\\n\\\", a,b,c,d); 
    } 
    }
    

    Ausgabe # 10 1008902410 3 3618913140

    😕



  • Ich nehme mal an, dass die Backslashes im Code aus Versehen da reingeraten sind.

    Dev-C++ 4.9.9.2, eh? Dass man den immer noch runterladen kann...also, Dev-C++ kommt mit gcc 3.4.2 (MinGW-Distribution), der im September 2004 erschien und inzwischen völlig veraltet ist. Wenn es da einen Compiler- bzw. Bibliotheksbug gibt, solltest du dich damit an die GCC-Mailing-Liste wenden, wobei ich die Vermutung habe, dass die dir erstmal mehr oder weniger höflich raten werden, es mit einer etwas weniger archaischen Version zu versuchen. Ich vermute auch, dass der gcc deiner Linux-Distribution neuer ist.

    Ich würde dich jetzt in Richtung wxDev-C++ verweisen, was so eine Art Fortführung von Dev-C++ ist, welches schon seit Jahren nicht mehr weiterentwickelt wird und in einem permanenten Beta-Status verweilt - 4.9.9.2 ist eine Beta-Version dessen, was mal als Dev-C++ 5.0 gedacht war. Allerdings ist die wxDev-C++-Seite gerade nicht erreichbar, also könntest du womöglich mit Code::Blocks glücklich werden.

    So oder so wirst du die LLU-Suffixe (ich kannte das bisher nur als ull) nicht los, die stehen im C-Standard als Kennzeichnung für unsigned long long-Literale so drin.



  • printf hat da einen anderen Formatspecifier für unsigned long long. Die Zahlen werden als einfaches long ausgegeben.



  • Danke für den Tipp.. Ich bin mal auf Code::Blocks gewechselt.

    Die Sonderzeichen sind beim Copy/Paste mit reingekommen.
    Die Ausgabe bleibt aber absoult äquivalent?!?
    Wenn ich die Variablen dynamisch fülle, wie mache ich das dann mit dem Präfix?



  • Ok,

    Abhilfe schafft

    printf("# %d %I64d %I64d %I64d\n", a,b,c,d);



  • firsttime schrieb:

    Wenn ich die Variablen dynamisch fülle, wie mache ich das dann mit dem Präfix?

    Der Formatstring ist ein ganz normaler C-String. Den kannst du auch mit sprintf erzeugen.


Anmelden zum Antworten