Wieso wird dieser Wert 0?



  • Ich habe den Fehler jetzt mit einer neueren Version des gcc Compilers gefunden. 🙂

    Unter Windows verwendete ich vorhin irgendwas mit gcc = Ver 3.5,
    der unter Linux ist mit Vers. > 4.x neurer und hat mir daher auch diese Warnung ausgespuckt, die der andere nicht ausspuckte:

    primzahltest.c:124: warning: format ‘%i’ expects type ‘int’, but argument 2 has type ‘long long int’
    

    Ein Austausch von &i nach %lld hat geholfen und Printf zeigt nun richtige Werte an:

    printf("i = %lld, primecounter = %i\n", blow_counter, primecounter);
    

    blow_counter ist nämlich vom Typ long long.



  • soweit ich das weiß ist long long aber nicht vom Standard definiert. Sofern das Programm aber eh nur für dieses Betriebssystem mit dem Compiler ist, ist das aber egal.



  • vvv schrieb:

    soweit ich das weiß ist long long aber nicht vom Standard definiert. Sofern das Programm aber eh nur für dieses Betriebssystem mit dem Compiler ist, ist das aber egal.

    Ja, long long gibt es nur für GCC.

    Macht aber nichts, da GCC auch unter Windows läuft.



  • C Anfänger schrieb:

    Ja, long long gibt es nur für GCC.

    long long signed int und long long unsigned int gibts auch für MSVC++. Damit deckt man schon einen grossen Teil ab.

    Nichtsdestotrotz sollte man sich nach was Anderem umsehen, wenn man wirklich portabel bleiben möchte.



  • Nexus schrieb:

    C Anfänger schrieb:

    Ja, long long gibt es nur für GCC.

    long long signed int und long long unsigned int gibts auch für MSVC++. Damit deckt man schon einen grossen Teil ab.

    Nichtsdestotrotz sollte man sich nach was Anderem umsehen, wenn man wirklich portabel bleiben möchte.

    Was würdest du als Alternative zu long long empfehlen?
    Ich brauche diese Typengröße nämlich wirklich.



  • vvv schrieb:

    soweit ich das weiß ist long long aber nicht vom Standard definiert. Sofern das Programm aber eh nur für dieses Betriebssystem mit dem Compiler ist, ist das aber egal.

    also bei mir ist long long int schon teil des std...

    ISO/IEC 9899:1999 (5.2.4.2.1 Sizes of integer types <limits.h>) schrieb:

    — minimum value for an object of type long long int
    LLONG_MIN -9223372036854775807 // −(263 − 1)



  • C Anfänger schrieb:

    Was würdest du als Alternative zu long long empfehlen?

    uint64_t
    aber das ist erstmal eh nur ein typedef auf long long.
    Nichtsdestrotrotz solle man bei explorativen primzahligen Dingen immer Typen nehmen, die die Bittigkeit mitangeben, damit man lustige Tricks einbauen kann, die vom Typ abhängen, denke ich.



  • %lld wird aber mit dem gcc port unter Windows nicht funktionieren (es sei denn da hat sich was geändert). Da müsste man dann %I64 verwenden.



  • C Anfänger schrieb:

    Was würdest du als Alternative zu long long empfehlen?
    Ich brauche diese Typengröße nämlich wirklich.

    Ich hätte da an irgendeine BigInteger-Bibliothek gedacht (nichts Konkretes), aber ohne Operatorüberladung weiss ich nicht, ob man das möchte. Vielleicht reicht long long bzw. unsigned long long ja...

    no_o_o_ schrieb:

    also bei mir ist long long int schon teil des std...

    Stimmt, in C99 gehört der Typ zum Standard. Anders bei C89 oder C++.



  • Tim schrieb:

    %lld wird aber mit dem gcc port unter Windows nicht funktionieren (es sei denn da hat sich was geändert). Da müsste man dann %I64 verwenden.

    Also ich benutzte %lld jetzt mit der GCC 3.5 Version unter Windows schon ne ganze Weile und printf kann den Wert zumindest richtig anzeugen.



  • volkard schrieb:

    uint64_t
    aber das ist erstmal eh nur ein typedef auf long long.

    So typedef- Header gibt's ein paar, aber die unterscheiden sich auch wieder voneinander.

    Welcher ist denn verbreitungstechnisch zu empfehlen? Und ja, typedefs ist eine Sache, die Typenauswertung bei Formatstrings eine Andere.
    Bislang ist mir da nichts echt Überzeugendes untergekommen, das Überraschungen beim printf() ausschließt. Hat da jemand an Tip?


Anmelden zum Antworten