C Pointer Pointer in Array speichern

OP #5152989
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?
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?
OP
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.
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
> 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
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.
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
};
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
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.
OP
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.