Forum: Mikrocontroller und Digitale Elektronik PIC18F97J60 Deklaration Array XC8


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 Ingo S. (schicki)


Bewertung
0 lesenswert
nicht 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?
//ursprüngliche Aufruf unverändert
//#define MAC_ADDRESS {0x00,0x04,0xa3,0x00,0x16,0x06}     // MAC-Adresse

// Variante 1 funktioniert
const unsigned int MAC_Adr_0 = 0x00;
const unsigned int MAC_Adr_1 = 0x00;
const unsigned int MAC_Adr_2 = 0x04;
const unsigned int MAC_Adr_3 = 0xa3;
const unsigned int MAC_Adr_4 = 0x00;
const unsigned int MAC_Adr_5 = 0x16;
const unsigned int MAC_Adr_6 = 0x06;

#define MAC_ADDRESS {MAC_Adr_0, MAC_Adr_1, MAC_Adr_2, MAC_Adr_3, MAC_Adr_4, MAC_Adr_5}     // MAC-Adresse


// 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;

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


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


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

HTH

von Ingo S. (schicki)


Angehängte Dateien:

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

von Frank K. (fchk)


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


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

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


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


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


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


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

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


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


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

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.