Wieso wird dieser Wert 0?
-
Kann es sein, dass du über die Grenzen von primzahlen2 drüberschreibst und da zufälligerweise primecounter liegt?
-
seldon schrieb:
Meine Kristallkugel ist (immer noch!) in der Werkstatt,
Ich würde gerne von meinem Programm mehr posten wenn ich könnte, aber ich arbeite an einer neuen mathematischen Idee und den Code daher bis jetzt noch nicht freigeben. Sry.
aber wild geraten sieht das für mich nach einem Buffer-Overflow aus. Wenn primecounter größer ist, als der Array-Index sein darf und primecounter direkt hinter dem Array auf dem Stack liegt, wird primecounter überschrieben.
Das wäre eine gute Erklärung, nur ist das Array mit
#define ANZAHL_PRIMZAHLEN 10000
int primzahlen2[ANZAHL_PRIMZAHLEN];definiert und vor der Zuweisung mit 0 (siehe oben) hat primecounter gerademal den Wert 9592.
D.h. da wäre noch genug Platz im Feld.Ich habe jetzt mal hinter dem 3 Befehl, also dem letzten printf noch ein neues printf hingesetzt und jetzt wird primecounter mit dem richtigen Wert ausgegeben.
Die Zeile habe ich hinzugefügt:
printf("\nPrimecounter = %i\n", primecounter);Das Verhalten ist natürlich höchst undefiniert.
Ja, das finde ich auch.
Ich denke ich werde es mal mit einem anderen Compiler oder wenigstens einer anderen Compilerversion compilieren.
-
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
undlong 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
undlong 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?