Forum: PC-Programmierung Pointer auf pointer probleme


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Felix (Gast)


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

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
cp6xPflModelValveRampConfiguration_s->risingFront;
(oder ähnlich) aufrufen kann und mir der Wert aus
output->HebenVorne
genommen wird

von Mark B. (markbrandis)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Felix schrieb:
> static libConfiguration_ts = {

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

von Rolf M. (rmagnus)


Bewertung
1 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.