Forum: PC-Programmierung C Pointer Pointer in Array speichern


von Flo (sandiegoo)


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?

: Verschoben durch Moderator
von Felix U. (ubfx)


Lesenswert?

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?

: Bearbeitet durch User
von Flo (sandiegoo)


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.

: Bearbeitet durch User
von Felix U. (ubfx)


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.

: Bearbeitet durch User
von Flo (sandiegoo)


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.

von Felix U. (ubfx)


Lesenswert?

Ach so, da macht es natürlich wirklich Sinn.

von Flo (sandiegoo)


Lesenswert?

Aber eine Antwort auf meine Ursprüngliche Frage habe ich jetzt leider 
immernoch nicht. Des Const an dieser Stelle habe ich schon versucht.

von Felix U. (ubfx)


Lesenswert?

Dann benutzt du wahrscheinlich den guten gcc. In reinem C wirst du die 
Struktur in einer Funktion initialisieren müssen.

: Bearbeitet durch User
von step by step (Gast)


Lesenswert?

Florian B. schrieb:
> const char* text_1 "Text 1";

möchtest du nicht aber
const char* const text_1[] = "Text 1";

von Flo (Gast)


Lesenswert?

Was möchte ich nicht?

Was bedeutet das zweite const?

von Daniel (Gast)


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.

von Daniel A. (daniel-a)


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
};

: Bearbeitet durch User
von step by step (Gast)


Lesenswert?

Flo schrieb:
> Was bedeutet das zweite const?

const pointer to const text.

von Felix U. (ubfx)


Lesenswert?

Daniel A. schrieb:
> Warum denn nicht einfach so:
Weil &xy auch keine constant expression ist, unabhängig vom variablentyp

: Bearbeitet durch User
von Daniel A. (daniel-a)


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

von schmitti (Gast)


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.

von Rolf M. (rmagnus)


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.

von Flo (sandiegoo)


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?

von schmitti (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.