www.mikrocontroller.net

Forum: Compiler & IDEs initializer element is not constant


Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.

Ich hab da ein kleines Problem.
Hier der Codeausschnitt:

//enc.h
unsigned char GetMac1();

//enc.c
unsigned char GetMac1()
{
  MAC_DDR = 0x00;
  return MAC1;
}

//uipopt.h
#define UIP_FIXEDETHADDR 1
//hier mein stümperhafter Eintrag
#define UIP_ETHADDR0    GetMac1()
//ENCJ28J60_MACx existieren
#define UIP_ETHADDR1  ENC28J60_MAC2
#define UIP_ETHADDR2  ENC28J60_MAC3
#define UIP_ETHADDR3  ENC28J60_MAC4
#define UIP_ETHADDR4  ENC28J60_MAC5
#define UIP_ETHADDR5  ENC28J60_MAC6

//uip.c
const struct uip_eth_addr uip_ethaddr = {{UIP_ETHADDR0,
            UIP_ETHADDR1,
            UIP_ETHADDR2,
            UIP_ETHADDR3,
            UIP_ETHADDR4,
            UIP_ETHADDR5}};


Die Fehlermeldung:
../Net/uip/uip.c:132: error: initializer element is not constant
../Net/uip/uip.c:132: error: (near initialization for 
'uip_ethaddr.addr[0]')

Wie kann ich mein Ausgabe dort einfügen?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie der Compiler schon sagt: Der Initialisierer muß eine 
Compilezeit-Konstante sein.

> Wie kann ich mein Ausgabe dort einfügen?

#define GetMac1() (MAC_DDR = 0x00, MAC1)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hast du Pech, das geht in C nicht.
Du kannst zur Initialisierung einer globalen Variablen
keinen Funktionsaufruf verwenden.

Die erste Funktion die in C ausgeführt werden kann, ist main()

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen Funktionsaufruf als Initialisierer geht bei C++, nicht aber bei C. 
Und mein define ist natürlich Blödsinn.

Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Puhh. Was mach ich da, bzw wo mach ich das. Sowas hab ich ja noch nie 
gesehen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sepp wrote:
> Puhh. Was mach ich da, bzw wo mach ich das. Sowas hab ich ja noch nie
> gesehen.

Ne andere Frage:
Wer oder was ist eigentlich MAC1? Ich vermute mal, das
ist ein Makro

Hintergrund: Gibt es einen Grund, warum du das nicht
so schreiben willst:

#define UIP_ETHADDR0    MAC1

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sepp wrote:
> Puhh. Was mach ich da, bzw wo mach ich das. Sowas hab ich ja noch nie
> gesehen.


Ich hoffe Rolf stimmt mir zu wenn ich sage: Musst du auch
nicht verstehen. Der Komma-Operator ist, nun ja, eine Waffe.

Im Übrigen hätte dir das Makro auch bei deinem Problem nicht
geholfen, da eine Zuweisung (und eine solche ist ja im Makro
enthalten) nun mal in einer Funktion stehen muss.

Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

also MAC1 sind Eingänge. Also hier soll MAC1 mit PINF gleichgesetzt 
sein. Ich will damit den Hexwert zweier Hexswitcher auslesen.
somit sollte #define UIP_ETHADDR0 MAC1 auch nicht funktionieren (,oder?)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sepp wrote:
> Hallo
>
> also MAC1 sind Eingänge. Also hier soll MAC1 mit PINF gleichgesetzt
> sein. Ich will damit den Hexwert zweier Hexswitcher auslesen.
> somit sollte #define UIP_ETHADDR0 MAC1 auch nicht funktionieren (,oder?)

Wenn MAC1 etwas darstellt, was zur Compilezeit zu einer Konstanten
evaluiert, dann sollte das schon gehen.

Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die Funktion ist raus. Die Zuweisung ist jetzt direkt, so wie von 
kbuchegg beschrieben. Leider wieder gleicher Fehler.
../Net/uip/uip.c:131: error: initializer element is not constant
../Net/uip/uip.c:131: error: (near initialization for 
'uip_ethaddr.addr[0]')


Das würde leider erklären warum jeder, der einen Webserver baut eine 
fest Mac vergibt.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sepp wrote:

> Das würde leider erklären warum jeder, der einen Webserver baut eine
> fest Mac vergibt.

Ich würde sagen, das liegt eher daran, dass die Mac Adresse eigentlich 
fest sein sollte.

Mach einfach das const weg, und weise den Wert am Anfang von main zu. 
Dann sollte es gehen.

Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war auch mein Gedanke. Leider wirft mir dann das Die uip tausende 
von Fehlermeldungen an verschiedensten stellen.
Die Lösung wird sein dem Makefile das generieren eines Defines zu 
überlassen und das änderen des Makefiles (also der MAC-Adressen) einem 
Script.

Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verdammt waren da viele Rechtschreibfehler drin in meinem Thread :)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst die MAC Adresse des uip-Stacks auch zur Laufzeit 
initialisieren.. Siehe conf-Datei.

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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