Frage zu Makro und Array

Gast #4710863
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
Gast #4710868
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)
#4710919
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
}));
Gast #4710928
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
Gast #4711119
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
Gast #4711765
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.