Hallo Zusammen,
ich habe ein Problem bei dem ich nicht wirklich weiterkomme. Und ein
wenig Hilfe von den C Profis unter euch brauche.
1
constchar*text_1"Text 1";
2
constchar*text_2"Text 2";
3
constchar*text_3"Text 3";
4
5
char**pointer_to_text=&text_1;
6
7
IRGENDEINSTRUKT_TStruktur_array[]={
8
// Pointer to Text, iwelche_zahlen, nochmehrzahlen
9
{pointer_to_text,123,456},
10
{pointer_to_woanders,789,123},
11
{.....}
12
};
So das ist mein prinzipieller Aufbau. Mein Problem besteht nun darin das
der Compiler sagt das pointer_to_text nicht konstant ist.
Ich habe schon einige "const platzierungsvarianten" ausprobiert
allerdings kommt immer der gleiche Fehler.
Irgendwelche Ideen?
Florian B. schrieb:> Ich habe schon einige "const platzierungsvarianten" ausprobiert> allerdings kommt immer der gleiche Fehler.
Ich behaupte mal, in deiner Struktur wird ein nicht-const pointer
verwendet. Const davorpacken. Für den "Zwischenpointer" pointer_to_text
natürlich das gleiche. Warum benutzt du überhaupt einen Pointer auf
einen Pointer?
so schaut meine Struktur aus.
Ich benutzen einen Pointer to Pointer um später im Programm den Text an
dieser Stelle ändern zu können ohne auf den Array Index achten zu
müssen. Sind in diesem Programm mehr als 100 Array Zeilen.
machen. Die Schreibweise mit dem nachgestellten const verdeutlicht mM
besser was gemeint ist, ist aber äquivalent zu deiner Schreibweise.
text_3 darf dann aber natürlich keine lokale Variable sein, sonst wird
es auch nicht funktionieren. Nimm' einfach einen einfachen Pointer.
> text_3 darf dann aber natürlich keine lokale Variable sein, sonst wird> es auch nicht funktionieren. Nimm' einfach einen einfachen Pointer.
Es ist alles Global was ich oben geschrieben habe.
Wenn ich einen einfachen Pointer nehme dann muss ich ja wieder auf den
Array Index achten, wenn ich den Text ändern möchte, was ich vermeiden
wollte.
Felix U. schrieb:> Daniel A. schrieb:>> Warum denn nicht einfach so:> Weil &xy auch keine constant expression ist, unabhängig vom variablentyp
Doch, ist es. c99 standard, abschnitt 6.6 constant expression,
unterpunkt 7 und 9: [1]
1
7. More latitude is permitted for constant expressions in initializers. Such a constant expression shall be, or evaluate to, one of the following:
2
— an arithmetic constant expression,
3
— a null pointer constant,
4
— an address constant, or
5
— an address constant for an object type plus or minus an integer constant expression.
1
9. An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or a pointer to a function designator; it shall be created explicitly using the unary & operator or an integer constant cast to pointer type, or implicitly by the use of an expression of array or function type. The array-subscript [] and member-access . and -> operators, the address & and indirection * unary operators, and pointer casts may be used in the creation of an address constant, but the value of an object shall not be accessed by use of these operators.
Aber in meinem oberen Beispiel war text_1 aber keine constant
expression, deshalb hier die korrigierte Version:
1
constchartext_1[]="Text 1";
2
constchartext_2[]="Text 2";
3
constchartext_3[]="Text 3";
4
5
constchar*pointer_to_text=text_1;
6
7
IRGENDEINSTRUKT_TStruktur_array[]={
8
// Pointer to Text, iwelche_zahlen, nochmehrzahlen
Mich graust ja bei der Vorstellung, dass er den statisch vom Compiler
für den Text belegten Platz später ändern/beschreiben will. Sowas sollte
man nicht ohne weiteres tun, zumal hier nicht einmal die Länge bekannt
ist. Besser die Zeichenketten mit ihrer Länge irgendwie funktional
kapseln und vielleicht auch dynamisch belegen. Aber das wäre ja auch ein
zu blöder Anfängerfehler...
Bei solchen Problemen lohnt sich immer wieder mal der Blick von außen,
ob die sperrige Lösung (die ja offensichtlich problematisch ist),
wirklich gut zur Aufgabe passt.
schmitti schrieb:> Mich graust ja bei der Vorstellung, dass er den statisch vom Compiler> für den Text belegten Platz später ändern/beschreiben will.
Wie kommst du darauf?
> Sowas sollte man nicht ohne weiteres tun, zumal hier nicht einmal die> Länge bekannt ist.
Korrektur: Sowas darf man nicht tun, da es nach ISO C undefiniertes
Verhalten verursacht.
schmitti schrieb:> dass er den statisch vom Compiler> für den Text belegten Platz später ändern/beschreiben will.
Hast du den den Thread überhaupt gelesen?
Ich will den Pointer zu dem Text ändern nicht den Text selber dieser ist
und bleibt const und Statisch.
schmitti schrieb:> Besser die Zeichenketten mit ihrer Länge irgendwie funktional> kapseln und vielleicht auch dynamisch belegen
Die Länge von C Strings interessiert mich gleich 0. Solange der Speicher
nicht voll ist. Was willst du mit der Länge anfangen?
Ich hatte das hier:
"Ich benutzen einen Pointer to Pointer um später im Programm den Text an
dieser Stelle ändern zu können ohne auf den Array Index achten zu
müssen. Sind in diesem Programm mehr als 100 Array Zeilen."
aber leider so verstanden. Aber wenn ich den Thread ja gar nicht gelesen
habe, ist ja alles in Ordnung. Offensichtlich weißt du ja Bescheid. Nur
keinen Streit.
Gruß und viel Erfolg