Forum: Compiler & IDEs initializer element is not constant


von Sepp (Gast)


Lesenswert?

Hallo zusammen.

Ich hab da ein kleines Problem.
Hier der Codeausschnitt:

1
//enc.h
2
unsigned char GetMac1();
3
4
//enc.c
5
unsigned char GetMac1()
6
{
7
  MAC_DDR = 0x00;
8
  return MAC1;
9
}
10
11
//uipopt.h
12
#define UIP_FIXEDETHADDR 1
13
//hier mein stümperhafter Eintrag
14
#define UIP_ETHADDR0    GetMac1()
15
//ENCJ28J60_MACx existieren
16
#define UIP_ETHADDR1  ENC28J60_MAC2
17
#define UIP_ETHADDR2  ENC28J60_MAC3
18
#define UIP_ETHADDR3  ENC28J60_MAC4
19
#define UIP_ETHADDR4  ENC28J60_MAC5
20
#define UIP_ETHADDR5  ENC28J60_MAC6
21
22
//uip.c
23
const struct uip_eth_addr uip_ethaddr = {{UIP_ETHADDR0,
24
            UIP_ETHADDR1,
25
            UIP_ETHADDR2,
26
            UIP_ETHADDR3,
27
            UIP_ETHADDR4,
28
            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?

von Rolf Magnus (Gast)


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)

von Karl H. (kbuchegg)


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()

von Rolf Magnus (Gast)


Lesenswert?

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

von Sepp (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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.

von Sepp (Gast)


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?)

von Karl H. (kbuchegg)


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.

von Sepp (Gast)


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.

von Benedikt K. (benedikt)


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.

von Sepp (Gast)


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.

von Sepp (Gast)


Lesenswert?

Verdammt waren da viele Rechtschreibfehler drin in meinem Thread :)

von Simon K. (simon) Benutzerseite


Lesenswert?

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

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.