Forum: Mikrocontroller und Digitale Elektronik PIC18F97J60 Deklaration Array XC8


von Ingo S. (schicki)


Lesenswert?

Hallo Zusammen,

ich würde gerne die MAX Adresse aus einem 24AA02E48 (I2C) bzw. einem 
25AA02E48 (SPI) auslesen. Nun bin gerade dabei den Code zu optimieren. 
Um die Ansteuerung des Busses geht es nicht.

Leider stoße ich bei der Deklaration von einem einfachen Array auf ein 
Problem. Wenn die die einzelnen Teile in einzelne Variablen schreibe 
dann funktioniert alles. Allerdings wenn ich das ganze mit einem Array 
versehen will mekert der Compiler -> conflicting declarations for 
variable "MAC_Adr". Ich bin mir sicher dass dies nur eine Winzigkeit bei 
der Schreibweise ist. Weiß jemand waran das liegt?
1
//ursprüngliche Aufruf unverändert
2
//#define MAC_ADDRESS {0x00,0x04,0xa3,0x00,0x16,0x06}     // MAC-Adresse
3
4
// Variante 1 funktioniert
5
const unsigned int MAC_Adr_0 = 0x00;
6
const unsigned int MAC_Adr_1 = 0x00;
7
const unsigned int MAC_Adr_2 = 0x04;
8
const unsigned int MAC_Adr_3 = 0xa3;
9
const unsigned int MAC_Adr_4 = 0x00;
10
const unsigned int MAC_Adr_5 = 0x16;
11
const unsigned int MAC_Adr_6 = 0x06;
12
13
#define MAC_ADDRESS {MAC_Adr_0, MAC_Adr_1, MAC_Adr_2, MAC_Adr_3, MAC_Adr_4, MAC_Adr_5}     // MAC-Adresse
14
15
16
// Variante 2 mit Array geht nicht
17
const unsigned int MAC_Adr[] = {0x00,0x00,0x00,0x00,0x00,0x00};
18
MAC_Adr[0] = 0x00;
19
MAC_Adr[1] = 0x04;
20
MAC_Adr[2] = 0xa3;
21
MAC_Adr[3] = 0x00;
22
MAC_Adr[4] = 0x16;
23
MAC_Adr[5] = 0x06;
24
25
#define MAC_ADDRESS {MAC_Adr[0],MAC_Adr[1],MAC_Adr[2],MAC_Adr[3],MAC_Adr[4],MAC_Adr[5]}     // MAC-Adresse

Viele Grüße
Ingo

von STK500-Besitzer (Gast)


Lesenswert?

Ingo S. schrieb:
> // Variante 2 mit Array geht nicht
> const unsigned int MAC_Adr[] = {0x00,0x00,0x00,0x00,0x00,0x00};
> MAC_Adr[0] = 0x00;
> MAC_Adr[1] = 0x04;
> MAC_Adr[2] = 0xa3;
> MAC_Adr[3] = 0x00;
> MAC_Adr[4] = 0x16;
> MAC_Adr[5] = 0x06;

Ein als "const" definiertes Array sollte man auch nicht mehr ändern 
wollen. Dann wäre es ja nicht konstant.
Lass einfach das "const" weg!

von g457 (Gast)


Lesenswert?

1
// Variante 2 mit Array geht
2
const unsigned int MAC_Adr[] = { 0x00, 0x04, 0xa3, 0x00, 0x16, 0x06 };

HTH

von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Geht leider beides nicht so ganz. Die Zuweisung macht noch Probleme 
(siehe Screenshot.

von Frank K. (fchk)


Lesenswert?

unsigned char MacAddr[6];

-> unsigned char ist für MAC Adressen der passende Typ
-> Länge des Array bei der Deklaration explizit angeben.
-> Initialisierung mit Nullen ist überflüssig.

fchk

von oerks (Gast)


Lesenswert?

> -> unsigned char ist für MAC Adressen der passende Typ
> -> Länge des Array bei der Deklaration explizit angeben.
> -> Initialisierung mit Nullen ist überflüssig.

+ Vielleicht mal einen K&R kaufen.

von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

man wird es kaum glauben. Meine Fachbücher habe ich alle durchgeschaut. 
Daher habe ich mich hier mal nachgefragt.

Der Compiler meckert immer noch.

von STK500-Besitzer (Gast)


Lesenswert?

Ingo S. schrieb:
> Der Compiler meckert immer noch.

Kann es sein, dass du MAC_Adr mehrfach definierst byw. versuchst yu 
deklarieren?

von Teo D. (teoderix)


Lesenswert?

Ingo S. schrieb:
> Der Compiler meckert immer noch.

Ah der MCC... Ich glaube das Zeug, das Mikrochip so mitliefert, ist 
nicht C99 kompatibel. Stell das mal auf C90 um!?

von AllesKönner (Gast)


Lesenswert?

Teo D. schrieb:
> Ah der MCC... Ich glaube das Zeug, das Mikrochip so mitliefert, ist
> nicht C99 kompatibel. Stell das mal auf C90 um!?

Wenn man keine Ahnung hat, einfach mal die Fresse halten!
XC8 Kann C99!

Ingo S. schrieb:
> // Variante 2 mit Array geht nicht
> const unsigned int MAC_Adr[] = {0x00,0x00,0x00,0x00,0x00,0x00};
> MAC_Adr[0] = 0x00;
> MAC_Adr[1] = 0x04;
> MAC_Adr[2] = 0xa3;
> MAC_Adr[3] = 0x00;
> MAC_Adr[4] = 0x16;
> MAC_Adr[5] = 0x06;

Wie denn auch, ausserhalb einer Funktion kannst du nur initalisieren und 
nicht eine Zuweisung durchführen!

g457 schrieb:
> // Variante 2 mit Array geht
> const unsigned int MAC_Adr[] = { 0x00, 0x04, 0xa3, 0x00, 0x16, 0x06 };

Korrekt!

von Ingo S. (schicki)


Lesenswert?

Danke!

Wie denn auch, ausserhalb einer Funktion kannst du nur initalisieren und
nicht eine Zuweisung durchführen!

Das war die Botschaft!

von Teo D. (teoderix)


Angehängte Dateien:

Lesenswert?

AllesKönner schrieb:
> Wenn man keine Ahnung hat, einfach mal die Fresse halten!
> XC8 Kann C99!

Dito..... 8-O

Der CX8 ja, nicht aber die Programmierer bei Mikrochip.
Ich hatte ständig Ärger mit angeblichen doppelten Deklarationen in den 
MCC_Files, die ich nicht nachvollziehen konnte. Auf C90 umgestellt und 
alles funst wie gedacht und erwartet...

von AllesKönner (Gast)


Lesenswert?

Ingo S. schrieb:
> //#define MAC_ADDRESS {0x00,0x04,0xa3,0x00,0x16,0x06}     // MAC-Adresse

//oder auch so
const unsigned int MAC_Adr[] = MAC_ADDRESS;

//oder so
enum {MAC_ADDR0, MAC_ADDR1, MAC_ADDR2, MAC_ADDR3, MAC_ADDR4, MAC_ADDR5};

const unsigned int MAC_Adr[] = {
   [MAC_ADDR0] = {0x00},
   [MAC_ADDR1] = {0x04},
   //...
};

von AllesKönner (Gast)


Lesenswert?

Teo D. schrieb:
> Ich hatte ständig Ärger mit angeblichen doppelten Deklarationen in den
> MCC_Files, die ich nicht nachvollziehen konnte. Auf C90 umgestellt und
> alles funst wie gedacht und erwartet...

Das ist wohl eher ein Problem der Hausfrau und deine Lösung via "Einfach 
mal den Stecker ziehen und wieder reinstecken" entspricht diesem Level.


Ich arbeite seit Jahren mit xc8 und kann sagen, dass es gibt kein 
Problem mit xc8 und c99 Konformität gibt.

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.