Mehrdimensionales Array

Gast #441732
Lesenswert?
• ▲
▼
Warum akzeptiert der avr-gcc foldenden Code nicht?

uint8_t mychar[8][8];
mychar[0][0] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
mychar[1][0] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};

Ich erhalte folgende Meldungen:

test.c:6: error: conflicting types for ‘mychar’
test.c:4: error: previous declaration of ‘mychar’ was here
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar[0]’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar[0]’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar[0]’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar[0]’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar[0]’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar[0]’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar[0]’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar[0]’)
test.c:6: warning: excess elements in array initializer
test.c:6: warning: (near initialization for ‘mychar’)
test.c:6: warning: data definition has no type or storage class
test.c:7: error: conflicting types for ‘mychar’
test.c:4: error: previous declaration of ‘mychar’ was here
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar[0]’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar[1]’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar[1]’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar[1]’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar[1]’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar[1]’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar[1]’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar[1]’)
test.c:7: warning: excess elements in array initializer
test.c:7: warning: (near initialization for ‘mychar’)
test.c:7: warning: data definition has no type or storage class
#441739
Lesenswert?
• ▲
▼
> test.c:6: warning: excess elements in array initializer
> test.c:6: warning: (near initialization for ‘mychar[0]’)

Willst du das Array initialisieren.

Dann mach das so:

uint8_t mychar[8][8] = {
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
   { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
   ....

   };


#441823
Lesenswert?
• ▲
▼
Initiailisieren ist nicht gleich Zuweisung!!

Auch wenn da ein '=' Zeichen geschrieben wird.

Initialisierung passiert immer bei der Definition
einer Variablen.
Alles andere danach ist immer eine Zuweisung.

Das heist, hier ...

   int i;
   i = 5;

... hier weist du i den Wert 5 zu (das ist eine Zuweisung).

Während hier ...

    int i = 5;

... hier wird i mit dem Wert 5 initialisiert.
Auch wenn beides ähnlich ausschaut, ist das konzeptionell
was völlig anderes.

Soweit als Vorgeplänkel.
Arrays kann man in C nicht als ganzes Zuweisen. Es gibt
keine Syntax dafür. Daher geht das

    int i[2];
    i = { 5, 6 };

nicht. Denn das ist ja eine Zuweisung.

Mann kann aber Arrays initialisieren, dafür gibt es eine
Syntax:

   int i[2] = { 5, 6 };

Das ist eine Initialisierung, daher geht das.
Gast #442221
Lesenswert?
• ▲
▼
OK, danke für die Erklärung!

Jetzt hätte ich noch eine Frage:

Wenn ich nun sowas wie

typedef struct mychar_
{
    uint8_t address;
    uint8_t lines[8];
}mychar;
mychar mychars[8];

benötige, kann ich auch dieses Struktur-Array auf ähnliche Weise 
INITIALISIEREN?
#442262
Lesenswert?
• ▲
▼
Die traditionelle Schreibweise wäre:

typedef struct mychar_
{
    uint8_t address;
    uint8_t lines[8];
}mychar;

mychar mychars[8] = {
     { 0x55, { 0xAA, 0xBB, 0xCC } },
     { 0x56, { 0xCC, 0xDD, 0xEE, 0xFF } },
     { ...
};

Für jede Schachtelungstiefe einfach ein { } Pärchen.

Die von Patrick vorgeschlagene neuere Schreibweise verwende
ich (wenn überhaupt) nur dann, wenn ich aus einer Struktur
nur einige Felder initialisieren will.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.