C Pointer Pointer in Array speichern

OP #5152989
Lesenswert?

Hallo Zusammen,

ich habe ein Problem bei dem ich nicht wirklich weiterkomme. Und ein 
wenig Hilfe von den C Profis unter euch brauche.
1
const char* text_1 "Text 1";
2
const char* text_2 "Text 2";
3
const char* text_3 "Text 3";
4

5
char** pointer_to_text = &text_1;
6

7
IRGENDEINSTRUKT_T Struktur_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?
OP #5153003
Lesenswert?

1
typedef struct{
2
const char** pointer;
3
int32 zahl1;
4
int32 zahl2;
5
}IRGENDEINSTRUKT_T;

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.
#5153010
Lesenswert?

dann kannst du
1
char const *text_3 = "Text 3";
2
char const **pointer_to_text = &text_3;
3

4
IRGENDEINSTRUKT_T Struktur_array[] = {
5
{  pointer_to_text,         123,               456},
6
};

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.
OP #5153021
Lesenswert?

> 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.
Gast #5153967
Lesenswert?

Das Problem ist, dass "const" aus einer Variablen keine "constant 
expression" im Sinne des C Standards macht. Selbst bei
1
const int x = 42;
2
int y = x;
meckert der Compiler.

In C++ ist constant expression übrigens anders definiert. Da geht das.
#5153981
Lesenswert?

Warum denn nicht einfach so:
1
const char* text_1 = "Text 1";
2
const char* text_2 = "Text 2";
3
const char* text_3 = "Text 3";
4

5
const char* pointer_to_text = text_1;
6

7
IRGENDEINSTRUKT_T Struktur_array[] = {
8
// Pointer to Text,         iwelche_zahlen,    nochmehrzahlen
9
{ &pointer_to_text,         123,               456},
10
{ &pointer_to_woanders,     789,               123},
11
{.....}
12
};
#5154539
Lesenswert?

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
const char text_1[] = "Text 1";
2
const char text_2[] = "Text 2";
3
const char text_3[] = "Text 3";
4

5
const char* pointer_to_text = text_1;
6

7
IRGENDEINSTRUKT_T Struktur_array[] = {
8
// Pointer to Text,         iwelche_zahlen,    nochmehrzahlen
9
{ &pointer_to_text,         123,               456},
10
{ &pointer_to_woanders,     789,               123},
11
{.....}
12
};
Compilierbares Minimalbeispiel: https://ideone.com/dNSYYT

1) http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
Gast #5157839
Lesenswert?

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.
#5157968
Lesenswert?

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.
OP #5158274
Lesenswert?

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?
Gast #5158533
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren