Array-Größe als Logarithmus

Warum wird C ++ dies nicht als Array-Größe zulassen?

const int SIZE = ceil(log10(pow(2., 1000)));
int arr[SIZE];

Für diejenigen, die daran interessiert sind, ist dies für Problem 16 auf ProjectEuler. Ich versuche, ein Array zu deklarieren, um jede Ziffer der Zahl 2 ^ 1000 zu halten, und das ist meine Art zu finden, wie viele Elemente ich brauche.

0
Was ist der Fehler?
hinzugefügt der Autor Cool_Coder, Quelle
Ich kann den Code ausführen: ideone.com/WU28aF
hinzugefügt der Autor Cool_Coder, Quelle
Fehler C2057: erwarteter konstanter Ausdruck
hinzugefügt der Autor bcf, Quelle
Zusammenstellungsprobleme beiseite: log10 (pow (2., 1000)) == 1000 * log10 (2.) (modulo die Genauigkeit von C ++ verdoppelt)
hinzugefügt der Autor Sean, Quelle

2 Antworten

Obwohl Sie das Konst-Qualifikationsmerkmal für SIZE verwenden, bedeutet dies nur, dass Sie eine schreibgeschützte Variable haben, deren Wert zur Kompilierzeit nicht bekannt ist. Wegen der Funktionsaufrufe ceil, log10, pow wird der Wert von SIZE zur Laufzeit nur bekannt sein, so dass der Compiler SIZE-Bytes nicht statisch zuordnen kann, weil er SIZE noch kennt.

Also, entweder dynamisch Speicher zuweisen oder den Wert selbst berechnen :)

0
hinzugefügt

Es ist nicht zulässig, weil die rechte Seite von = kein konstanter Ausdruck ist, der für SIZE als konstanter Ausdruck benötigt wird. Jetzt bedeutet const int lediglich, dass es ein schreibgeschütztes Integer-Objekt ist.

const int SIZE = ceil(log10(pow(2., 1000)));

Verwenden Sie stattdessen ein dynamisches Array, z. B. std :: vector .

Oder Sie können Ihren Rechner nehmen und den Wert fest codieren - er ist übrigens ungefähr 301.03 :)

0
hinzugefügt
Ist es nicht konstant, da die Funktionen log und ceil je nach Rundung unterschiedliche Werte annehmen können?
hinzugefügt der Autor bcf, Quelle
@David Das und wegen der Tatsache ceil und log10 werden nicht deklariert . Was sie sowieso nicht sein können, da sie aus der C-Bibliothek stammen.
hinzugefügt der Autor jrok, Quelle