Forum: Mikrocontroller und Digitale Elektronik Frage zu Makro und Array


von Jörg (Gast)


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:
1
 typedef struct 
2
 {
3
     uint8_t  value1;        
4
     int8_t   value2;         
5
 } sArray;
6
7
const sArray ArrayLookup[] =
8
{
9
    { 14, 30 },
10
    { 15, 40 }, 
11
    { 16, 50 }, 
12
    { 17, 60 }, 
13
    { 18, 7 }
14
};

Dieses Array soll in einem Makro verwendet werden:
1
NEUES_MAKRO(x)     x
2
3
NEUES_MAKRO(const sArray ArrayLookup[] =
4
{
5
    { 14, 30 },
6
    { 15, 40 }, 
7
    { 16, 50 }, 
8
    { 17, 60 }, 
9
    { 18, 7 }
10
});

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

Ich bekomme nun die Fehlermeldung:
1
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:
1
NEUES_MAKRO(const char String[]= "\nTest";);


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

Vielen Dank.

Gruß

Jörg

von ich (Gast)


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)

von guest (Gast)


Lesenswert?

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

von Dr. Sommer (Gast)


Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

Den Inhalt eines derartigen Makros kann man praktisch zu nichts 
gebrauchen:
1
#define UNPACK(...) __VA_ARGS__
2
#define NEUES_MAKRO(x) UNPACK x
3
4
NEUES_MAKRO((const sArray ArrayLookup[] =
5
{
6
    { 14, 30 },
7
    { 15, 40 }, 
8
    { 16, 50 }, 
9
    { 17, 60 }, 
10
    { 18, 7 }
11
}));

von Jörg (Gast)


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:
1
#define NEUES_MAKRO(x)    x __attribute__((__progmem__))
oder eben nur x.


Vielen Dank.

Gruß

Jörg

von Dr. Sommer (Gast)


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:
1
// Daten im Flash ablegen
2
#define NEUES_MAKRO __attribute__((__progmem__))
3
4
// ... oder ...
5
6
// Nicht im Flash ablegen
7
#define NEUES_MAKRO
8
9
const sArray ArrayLookup[] NEUES_MAKRO =
10
{
11
    { 14, 30 },
12
    { 15, 40 }, 
13
    { 16, 50 }, 
14
    { 17, 60 }, 
15
    { 18, 7 }
16
};
Im Endeffekt genauso wie PROGMEM funktioniert, iirc

von Jörg (Gast)


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

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.