mikrocontroller.net

Forum: Compiler & IDEs Mehrdimensionales Array


Autor: adds (Gast)
Datum:

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

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil
 mychar[0][0] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

sieben elemente zuviel sind.
 mychar[0][0] = 0x00;

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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 },
   ....

   };



Autor: adds (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mychar[0] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

funktioniert aber auch nicht!

Ich brauche 8 Variablen zu je 8 Elementen.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> mychar[0] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

Man kann in C keine Arrays zuweisen.
Wenn du initialisieren willst, dann musst du das als
Initialisierungssyntax bei der Definition des Arrays
angeben. Syntax siehe oben.

Autor: adds (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, man kann das quasi nicht zur Laufzeit festlegen. Schade.

Autor: adds (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber ganz verstehe ich es doch nicht:
Einzeilig initialisieren funktioniert nicht, doch wenn man die Elemente 
einzeln setzt, das klappt doch...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: adds (Gast)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef struct mychar_s
{
    uint8_t address;
    uint8_t lines[8];
} mychar_t;

mychar_t mychars[8] = {
    [0].address = 0x55,
    [0].lines = 0xAA,
    [1].address = 0x12,
    [1].lines = 0x34,
    /*...*/
};

  

Autor: adds (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mir jetzt nicht ganz sicher, ob das gleichwertig ist zu:

mychars[0].address = 0x55;
mychars[0].lines[0] = 0xAA;
mychars[1].address = 0x12;
mychars[1].lines[1] = 0x34;

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

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

Autor: adds (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die schnelle Hilfe!

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.