Forum: Mikrocontroller und Digitale Elektronik C -> Struct -> Initalisieren


von Anja F. (Gast)


Lesenswert?

Hallo (:

Ich habe folgende Frage..
Bitte nicht direkt wieder ausfällig werden..
1
const char* pMsg = "Test"; 
2
3
typedef struct
4
{
5
  const char* pPtr;
6
}sTest_t;
7
8
sTest_t sTest[]=
9
{
10
 { (char*)&pMsg},
11
};

Wenn ich jetzt versuche auf einer Anzeige "sTest.pPtr" auszugeben kommt 
wahrscheinlich nur die Adresse von "pMsg".. Ich sehe nur komische 
Zeichen auf der Anzeige.

Wie initialisiert man das richtig, klappt das überhaupt?

Vielen Dank im voraus :)

von Eric B. (beric)


Lesenswert?

sTest is ein Array, du brauchst ein INdex: sTest[0].pPtr

von abc (Gast)


Lesenswert?

Und &pMsg ist ein char** also nur pMsg

von Adam P. (adamap)


Lesenswert?

abc schrieb:
> Und &pMsg ist ein char** also nur pMsg

Genau so ist es.

Geht beides bei der Ausgabe:
1
const char* pMsg_1 = "Test_1";
2
const char* pMsg_2 = "Test_2";
3
4
typedef struct
5
{
6
  const char* pPtr;
7
} sTest_t;
8
9
sTest_t sTest[] =
10
{
11
  {(char*)pMsg_1},
12
  {(char*)pMsg_2}
13
};
14
15
/******************************************************************************/
16
int main()
17
{
18
  printf("%s\n", sTest[0].pPtr);
19
  printf("%s\n", sTest[1]);
20
21
  printf("\n");
22
  system("PAUSE");
23
  return 0;
24
}

von Rolf M. (rmagnus)


Lesenswert?

Warum hast du da gecastet? Bevor man einen Cast hinschreibt, sollte man 
immer genau wissen, wieso er nötig ist. Und nein, "weil sonst eine 
Warnung kommt" ist keine gültige Antwort. ;-)
pMsg ist ein Zeiger auf einen const char. Du übergibst aber nicht den 
Wert dieses Zeigers in deine Struktur, sondern seine Adresse. Lass das & 
weg, dann passt es. Und dann brauchst du auch den Cast nicht.

von Anja F. (Gast)


Lesenswert?

In der main() klappt das..
Über der main() ( wie nennt man diesen Vorgang?! ) klappt das nicht. Da 
meckert und sagt:
1
initalizer element is not constant

von DPA (Gast)


Lesenswert?

Nimm mal "const char pMsg_1[]" statt "const char* pMsg_1". In letzterem 
fall ist pMsg_1 das Symbol, welches auf die Variable zeigt, welches den 
Pointer enthält, welcher auf den Text zeigt. In ersterem Fall hingegen 
zeigt das Symbol direkt auf den Anfang der Daten, und nicht auf nen 
pointer, den man noch ändern könnte. Die Addresse von einem Array kann 
man hier als Konstant betrachten, der wert von einer pointer variable, 
nicht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Anja F. schrieb:
> In der main() klappt das..

Da passiert die Initialisierung zur Laufzeit des Programms.

> Über der main() ( wie nennt man diesen Vorgang?! ) klappt das nicht.

Ich würde den Vorgang "Definition mit einhergehender Initialisierung" 
nennen.

Du kannst da keine Struct mit variablen Inhalten füllen. Denn diese 
Initialisierung passiert zur Compile Time, nicht zur Laufzeit.

> Da
> meckert und sagt:initalizer element is not constant

Initialisierung zur Compile Time geht nur mit Konstanten, nicht mit 
Variablen.

Schreibe also:
1
typedef struct
2
{
3
  const char * pPtr;
4
} sTest_t;
5
6
sTest_t sTest[] =
7
{
8
  { "Test_1" },
9
  { "Test_2" }
10
};

Das funktioniert. Oder initialisiere die Struct zur Laufzeit in der 
main-Funktion. Da gehts dann auch mit Variablen. Denn diese haben dann 
auch einen definierten Wert.

von DPA (Gast)


Lesenswert?

Frank M. schrieb:
> Initialisierung zur Compile Time geht nur mit Konstanten, nicht mit
> Variablen.

Und arrays sowie mit referenzen auf Variablen, aus den selben gründen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

DPA schrieb:
> Nimm mal "const char pMsg_1[]" statt "const char* pMsg_1".

Korrekt, das funktioniert. Die Initialisierung über
1
const char  pMsg_1[] = "Test_1";
2
const char  pMsg_2[] = "Test_2";
3
...
4
sTest_t sTest[] =
5
{
6
  {(char*)pMsg_1},
7
  {(char*)pMsg_2}
8
};

wird damit nicht mehr vom Compiler angemeckert.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Da das Struct-Element richtigerweise als const char * deklariert ist,
muss das const der globalen Variablen auch nicht weggecastet werden (was
ohnehin ein sehr zweifelhaftes Vorgehen wäre). Die hässlichen Casts
können also ersatzlos entfallen:

1
const char msg1[] = "Test 1"; 
2
const char msg2[] = "Test 2"; 
3
4
typedef struct
5
{
6
  const char *pMsg;
7
} sTest_t;
8
9
sTest_t sTest[] =
10
{
11
  { msg1 },
12
  { msg2 }
13
};

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.