Forum: PC-Programmierung Pointer auf pointer probleme


von Felix (Gast)


Lesenswert?

Hallo,
ich habe eine Variable, welche ein pointer auf eine variable von einer 
Library ist.
1
static libOutput* output;
Jetzt wollte ich einen struct erstellen, wo mir die parameter auf 
einzelene Elemente des outputs zeigen.
1
typedef struct
2
{
3
  uint8 risingFront;
4
  uint8 loweringFront;
5
  uint8 risingBack;
6
  uint8 loweringBack;
7
}libConfiguration_ts;
Diese parameter sind auch in output vorhanden.
Jetzt habe ich gedacht, mache ich einen pointer und zeige auf die 
Ausgangsvariablen
1
static libConfiguration_ts = {
2
  &output->HebenVorne,
3
  &output->SenkenVorne,
4
  &output->HebenHinten,
5
  &output->SenkenHinten
6
}

jetzt bekomme ich aber den error
'initializer element is not constant'

das ich mit pointern noch nicht ganz so fit bin, sieht man ja 
wahrscheinlich.

Ziel ist es, dass ich später
1
cp6xPflModelValveRampConfiguration_s->risingFront;
(oder ähnlich) aufrufen kann und mir der Wert aus
1
output->HebenVorne
genommen wird

von Mark B. (markbrandis)


Lesenswert?

> static libConfiguration_ts = {
>  &output->HebenVorne,
>  &output->SenkenVorne,
>  &output->HebenHinten,
>  &output->SenkenHinten
>}

libConfiguration_ts kann nicht gleichzeitig als static deklariert werden 
und mit Werten initialisiert werden, die erst zur Laufzeit bekannt sind. 
Entweder oder.

https://stackoverflow.com/questions/3025050/error-initializer-element-is-not-constant-when-trying-to-initialize-variable-w

von Sebastian (Gast)


Lesenswert?

Mark B. schrieb:
> libConfiguration_ts kann nicht gleichzeitig als static deklariert werden

Hat mit "static" aber nicht viel zu tun.
Sondern damit, dass zum Zeitpunt der Initialisierung die Werte bekannt 
sein müssen.
Und bei so einer globalen Variablen ist das nur bei Konstanten der Fall.

Da die "output" Variable nicht konstant ist, ist dann auch 
"&output->HebenVorne" nicht konstant.

Klappt so aber eh nicht, denn "&output->HebenVorne" ist ein Zeiger. Und 
libConfiguration_ts hat uint8_t Elemente.

Also:

Entweder diese Elemente auch als Zeiger deklarieren (und hier noch 
dereferenzieren mit einem extra Sternchen: 
cp6xPflModelValveRampConfiguration_s->risingFront)

Oder den Wert statt Zeigern reinkopieren - wenn du keine guten Gründe 
dagegen hast (z.B. dass immer der aktuelle Wert gebraucht wird).

von Klaus (Gast)


Lesenswert?

Felix schrieb:
> static libConfiguration_ts = {

Wo ist der Variablenname ? Ich sehe nur den Typnamen...

von Rolf M. (rmagnus)


Lesenswert?

Sebastian schrieb:
> Mark B. schrieb:
>> libConfiguration_ts kann nicht gleichzeitig als static deklariert werden
>
> Hat mit "static" aber nicht viel zu tun.

Kommt drauf an, wo dieses Codefragment steht. Das Problem ist, dass in C 
(ich vermute mal, dass es darum geht) Variablen mit "static storage 
duration" nur mit Compilezeit-Konstanten initialisiert werden können. 
Innerhalb einer Funktion nutzt man dazu "static". Außerhalb davon ist es 
unabhängig davon, ob die Variable "static" ist.

> Sondern damit, dass zum Zeitpunt der Initialisierung die Werte bekannt
> sein müssen.
> Und bei so einer globalen Variablen ist das nur bei Konstanten der Fall.
>
> Da die "output" Variable nicht konstant ist, ist dann auch
> "&output->HebenVorne" nicht konstant.

Vor allem, da output selbst wieder ein Zeiger ist, der hier 
dereferenziert werden müsste. Auch wenn output const wäre, würde es 
nicht funktionieren, da eine Compilezeit-Konstante nötig ist, und eine 
const-Variable ist das in C nicht.

> Entweder diese Elemente auch als Zeiger deklarieren (und hier noch
> dereferenzieren mit einem extra Sternchen:
> cp6xPflModelValveRampConfiguration_s->risingFront)

Davon geht das Problem allerdings nicht weg.

Eine Möglichkeit, damit umzugehen ist, auf die Initialisierung an der 
Stelle zu verzichten und die Variable zu gegebenem Zeitpunkt per 
Zuweisung zu befüllen.

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.