Arrayinitialisierung nur per define möglich
-
Big Brother schrieb:
Man kann ein Array auch mit nem enum initialisieren.
enum { N = 100 }; char arr [N];
Die Variante benutze ich in der Regel. Bin irgend wie nur nicht drauf gekommen sie hier zu erwähnen :).
-
Big Brother schrieb:
Man kann ein Array auch mit nem enum initialisieren.
enum { N = 100 }; char arr [N];
Eine Arrayinitialisierung ist das allerdings nicht.
-
rüdiger schrieb:
das ist doch das Grundproblem von #define
kennste #undef?
-
camper schrieb:
Big Brother schrieb:
Man kann ein Array auch mit nem enum initialisieren.
enum { N = 100 }; char arr [N];
Eine Arrayinitialisierung ist das allerdings nicht.
Wieso nicht. Steht dann nix drin in den Arrayelementen?
-
-std=c99 als Flag übergeben
Kennt der GCC leider nicht.
Jedoch werden mit const sehr wohl "echte" Konstanten erzeugt,
nur mit glück, wenn sie in einen speicherbereich kommen, der physikalisch schreibgeschützt ist.
Kannst du das vllt. mal ein bisschen ausführen?
Der Begriff Integerkonstante in C entspricht dem des Integerliterals in C++.
Heißt das, "5" ist nach der C-Definition konstant, "const int n=5;" dagegen nicht (bzw. es ist die Entscheidung des Compilers)?
@camper: Danke für den Code. Sieht praktisch aus.Wieso nicht. Steht dann nix drin in den Arrayelementen?
Weils nur ne Deklaration ist. Du kannst sie aber erweitern mit "char arr[N] = {0};".
-
moagnus schrieb:
-std=c99 als Flag übergeben
Kennt der GCC leider nicht.
Ich bin entsetzt. Fängt die Versionsnummer noch mit 2 an?!?
Der Begriff Integerkonstante in C entspricht dem des Integerliterals in C++.
Heißt das, "5" ist nach der C-Definition konstant, "const int n=5;" dagegen nicht (bzw. es ist die Entscheidung des Compilers)?
Nicht konstant ist n im Sinne von "Konstant zur Kompilierungszeit".
-
moagnus schrieb:
Jedoch werden mit const sehr wohl "echte" Konstanten erzeugt,
nur mit glück, wenn sie in einen speicherbereich kommen, der physikalisch schreibgeschützt ist.
Kannst du das vllt. mal ein bisschen ausführen?
auf einem microcontroller z.b. landen const-objekte z.b. oft im flash. das ist ein speicher, der zwar einfach gelesen, aber nicht 'auf normalem' wege beschrieben werden kann. schreibzugriffe haben dort entweder gar keine wirkung, oder lösen eine exception aus.
übrigens sind solche 'gespeicherten' konstanten nur als array, structs oder funktionen interessant. einzelne, konstante integers, chars, etc. irgendwo gespeichert zu haben, hat selten einen vorteil. oft ist ein schlichtes #define nützlicher.
-
Amen! ^^
-
Mein Compiler (gcc 4.1)
Nicht konstant ist n im Sinne von "Konstant zur Kompilierungszeit".
Ok. Und durch die Präprozessorersetzung bei "#define SIZE 5" ist eine Angabe mit SIZE bereits zur Kompilierungszeit konstant, ja?
@fricky: Bleiben halt noch die unschönen "Nebenwirkungen" von #define... Bzw. man benutzt die Lösung von Big Brother/ruediger. Damit erhält man ja auch ne "Konstante".
-
moagnus schrieb:
Mein Compiler (gcc 4.1)
Der muss -std=c99 kennen.
-
Sorry, keine Ahnung, was ich vorhin für nen Blödsinn gemacht hab. Das Flag wird jetzt akzeptiert, das Problem dadurch aber leider nicht behoben.
-
moagnus schrieb:
@fricky: Bleiben halt noch die unschönen "Nebenwirkungen" von #define... Bzw. man benutzt die Lösung von Big Brother/ruediger. Damit erhält man ja auch ne "Konstante".
naja, so'n define als konstante ist harmlos. unschöne nebenwirkungen haben nur function-like makros, aber die sind auch überschaubar. aber klar, enums sind auch prima konstanten.
-
fricky schrieb:
moagnus schrieb:
Jedoch werden mit const sehr wohl "echte" Konstanten erzeugt,
nur mit glück, wenn sie in einen speicherbereich kommen, der physikalisch schreibgeschützt ist.
Kannst du das vllt. mal ein bisschen ausführen?
auf einem microcontroller z.b. landen const-objekte z.b. oft im flash. das ist ein speicher, der zwar einfach gelesen, aber nicht 'auf normalem' wege beschrieben werden kann. schreibzugriffe haben dort entweder gar keine wirkung, oder lösen eine exception aus.
übrigens sind solche 'gespeicherten' konstanten nur als array, structs oder funktionen interessant. einzelne, konstante integers, chars, etc. irgendwo gespeichert zu haben, hat selten einen vorteil. oft ist ein schlichtes #define nützlicher.
Ähem, und die Define-Literale müssen nirgends gespeichert werden? Wo soll das Programm seine Werte denn herzaubern? Aus dem Silizum brechen?
-
Was spricht gegen
char *p = "huhu";
oder
char p[] = "haha";
?
Der Compiler weiß doch wie lange der String ist.
-
Bei #define SIZE 5 ersetzt der Preprozessor wie gesagt die entsprechenden Stellen (SIZE durch 5), die 5 taucht im Code der "EXE" und damit auch im Arbeitsspeicher (bei Ausführung) nicht auf. Das Array wird die Länge 5 haben und fertig. Andernfalls (nicht #define) ist die Länge ebenfalls klar, aber die 5 ist zusätzlich und völlig unnütz auch noch im Code und bei Ausführung im ProcessMemory oder wo auch immer vorhanden.
-
#define BUFF_SIZE 128 unsigned char buf[BUFF_SIZE]; FILE* fid = fopen("pups.dat", "rb"); /*...*/ while(!feof(fid)) { fread(buf, sizeof(buf), 1, fid); /*process buf*/ } fclose(fid);
PS: Es gibt noch was anderes, als String-Literale...
-
dust schrieb:
Bei #define SIZE 5 ersetzt der Preprozessor wie gesagt die entsprechenden Stellen (SIZE durch 5), die 5 taucht im Code der "EXE" und damit auch im Arbeitsspeicher (bei Ausführung) nicht auf. Das Array wird die Länge 5 haben und fertig. Andernfalls (nicht #define) ist die Länge ebenfalls klar, aber die 5 ist zusätzlich und völlig unnütz auch noch im Code und bei Ausführung im ProcessMemory oder wo auch immer vorhanden.
Ehem, und dann kommt im Code ja noch meist sowas:
int cnt; for(cnt = 0; cnt < SIZE; ++cnt) { /*...*/ }
So, und was passiert? Richtig. SIZE wird durch den Wert 5 ersetzt. Und diese 5 wird zu einem Bestandteil Deines Kompilates und steht irgendwo im Speicher. Oder wo soll er die Deiner Meinung nach her nehmen? Zur Laufzeit gibts keinen Präprozessor.
-
RICHTIG, da steht der WERT 5, aber eben NUR dort und nicht noch am arsch irgendwo ... einmal weniger halt ...
EDIT: GO 4 Seite5 ^^
-
char *p="12345";
funzt,
char p[4] = "123456";
haut Dir das Programm zusammen bzw. ergibt schwer zu findende Probleme.
Ob da eine "4" oder eine Konstante per #define drinne steht ist egal.
Der Präprozessor ersetzt im Quelltext und nicht zur Laufzeit.[code]#define HEPP 4
char p[HEPP] ="...";[quote]ist absolut identisch mit
[code]char p[4] ="...";[quote]
-
dust schrieb:
RICHTIG, da steht der WERT 5, aber eben NUR dort und nicht noch am ***** irgendwo ... einmal weniger halt ...
EDIT: GO 4 Seite5 ^^