mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Makro und Array


Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe eine Frage zu Makros und Arrays.

Da folgende Beispiel ist etwas vereinfacht, aber zeigt, hoffentlich was 
ich meine.

Ich habe ein Array:

 typedef struct 
 {
     uint8_t  value1;        
     int8_t   value2;         
 } sArray;

const sArray ArrayLookup[] =
{
    { 14, 30 },
    { 15, 40 }, 
    { 16, 50 }, 
    { 17, 60 }, 
    { 18, 7 }
};

Dieses Array soll in einem Makro verwendet werden:
NEUES_MAKRO(x)     x

NEUES_MAKRO(const sArray ArrayLookup[] =
{
    { 14, 30 },
    { 15, 40 }, 
    { 16, 50 }, 
    { 17, 60 }, 
    { 18, 7 }
});

Das mag etwas sinnbefreit sein im Moment , aber es soll nur als Beispiel 
dienen.

Ich bekomme nun die Fehlermeldung:
Error[Pe055]: too many arguments in invocation of macro "NEUES_MAKRO"  

Kann mir jemand sagen, warum das so nicht funktioniert? Liegt es an den 
Strukturen?

Folgendes funktioniert einwandfrei:
NEUES_MAKRO(const char String[]= "\nTest";);


Gibt es eine Möglichkeit das trotzdem so in der Art umzusetzen?

Vielen Dank.

Gruß

Jörg

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
packe mal alles in eine Zeile.
Wenn ich mich recht entsinne, kann der Präprozessor das nur auswerten, 
wenn es in einer Zeile steht (oder mit \ die nächste Zeile mit 
ausgewertet wird)

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Fehlermeldung kommt durch die Kommas, die dienen auch bei Makros zur 
Trennung mehrerer Parameter.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal was dein Makro tut, vielleicht gibt es eine bessere 
Möglichkeit... Ansonsten helfen evtl variadische Makros.

Autor: Daniel Abrecht (daniel-a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Inhalt eines derartigen Makros kann man praktisch zu nichts 
gebrauchen:
#define UNPACK(...) __VA_ARGS__
#define NEUES_MAKRO(x) UNPACK x

NEUES_MAKRO((const sArray ArrayLookup[] =
{
    { 14, 30 },
    { 15, 40 }, 
    { 16, 50 }, 
    { 17, 60 }, 
    { 18, 7 }
}));

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

das Makro soll eigentlich nur dazu dienen, entsprechende Daten im Flash 
speichern zu können, ohne er überall zu ändern.

Man verwendet dann das Makro und wenn man die Daten im Flash ablegen 
möchte, verwendet man eben folgendes:
#define NEUES_MAKRO(x)    x __attribute__((__progmem__))
oder eben nur x.


Vielen Dank.

Gruß

Jörg

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg schrieb:
> das Makro soll eigentlich nur dazu dienen, entsprechende Daten im Flash
> speichern zu können, ohne er überall zu ändern.
Warum so kompliziert? warum nicht einfach so:
// Daten im Flash ablegen
#define NEUES_MAKRO __attribute__((__progmem__))

// ... oder ...

// Nicht im Flash ablegen
#define NEUES_MAKRO

const sArray ArrayLookup[] NEUES_MAKRO =
{
    { 14, 30 },
    { 15, 40 }, 
    { 16, 50 }, 
    { 17, 60 }, 
    { 18, 7 }
};
Im Endeffekt genauso wie PROGMEM funktioniert, iirc

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,


so könnte man es natürlich auch machen. Das ist auch sehr 
übersichtlich/übersichtlicher. Vielen Dank für den Hinweis.


Vielen Dank.

Gruß

Jörg

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.