Hallo,
habe jetzt auch mal 'ne Frage:
Ich möchte unter VS2005 einen Zwischenpuffer für die Funktionen _itoa(), etc. anlegen, in dem der erzeugte String abgelegt wird. Jetzt wollte ich das schön (i. e. Compilerunabhängig, etc.) machen und für die Puffergröße kein Zahlenliteral ablegen, sondern die "richtige" Größe für den Puffer berechnen lassen. Prinzipiell ginge das dann so:
Puffergröße = (int) ( ceil( log10( (double) ULLONG_MAX ) / log10( (double) Base ) ) ) + 2
Im Detail:
-> log10( ULLONG_MAX ) berechnet die Anzahl der Dezimalstellen der Zahl in der Zahlenbasis Base (noch als double mit Nachkommastellen),
-> ceil() rundet diese zur Ganzzahl auf und
-> + 2 schafft zusätzlichen Platz für ein Vorzeichen und den Terminator \0
Leider, leider mault der Compiler beim Versuch den Puffer via
static char TempInitBuf[(int) (ceil( log10( (double) ULLONG_MAX ) ) ) + 2];
zu instanziieren jedoch mit einem
error C2057: Konstanter Ausdruck erwartet
und das verstehe ich nicht so ganz, denn obiger Ausdruck ist konstant und wäre durchaus zur Compilezeit berechenbar!
Ich vermute aber mal, der MS-Compiler ist zu hohl zu blicken, dass auch doubles Konstanten sein können, denn:
static const int MaxDez = 22;
static char TempInitBuf[MaxDez]; // OK!
static const double MaxDez = 22.0;
static char TempInitBuf[(int) MaxDez]; // C2057!!
Wie kann man das jetzt anders lösen? Any ideas? Mir fällt nur noch die wesentlich unportablere Möglichkeit über ein (hardcodiertes)
#define MAXDEZ 22
ein.
habe jetzt auch mal 'ne Frage:
Ich möchte unter VS2005 einen Zwischenpuffer für die Funktionen _itoa(), etc. anlegen, in dem der erzeugte String abgelegt wird. Jetzt wollte ich das schön (i. e. Compilerunabhängig, etc.) machen und für die Puffergröße kein Zahlenliteral ablegen, sondern die "richtige" Größe für den Puffer berechnen lassen. Prinzipiell ginge das dann so:
Puffergröße = (int) ( ceil( log10( (double) ULLONG_MAX ) / log10( (double) Base ) ) ) + 2
Im Detail:
-> log10( ULLONG_MAX ) berechnet die Anzahl der Dezimalstellen der Zahl in der Zahlenbasis Base (noch als double mit Nachkommastellen),
-> ceil() rundet diese zur Ganzzahl auf und
-> + 2 schafft zusätzlichen Platz für ein Vorzeichen und den Terminator \0
Leider, leider mault der Compiler beim Versuch den Puffer via
static char TempInitBuf[(int) (ceil( log10( (double) ULLONG_MAX ) ) ) + 2];
zu instanziieren jedoch mit einem
error C2057: Konstanter Ausdruck erwartet
und das verstehe ich nicht so ganz, denn obiger Ausdruck ist konstant und wäre durchaus zur Compilezeit berechenbar!
Ich vermute aber mal, der MS-Compiler ist zu hohl zu blicken, dass auch doubles Konstanten sein können, denn:
static const int MaxDez = 22;
static char TempInitBuf[MaxDez]; // OK!
static const double MaxDez = 22.0;
static char TempInitBuf[(int) MaxDez]; // C2057!!
Wie kann man das jetzt anders lösen? Any ideas? Mir fällt nur noch die wesentlich unportablere Möglichkeit über ein (hardcodiertes)
#define MAXDEZ 22
ein.
Comment