Forum: PC-Programmierung Iteration über mehrere #defines


von moOmb@ (Gast)


Lesenswert?

Hallo zusammen!
Ich muss in meine Firma einen Treiber für µC programmieren. Die 
Codingrichtlinien besagen - Registeradressen müssen per #define angelegt 
werden.So:
#define SCI_SCI0BDL_ADR_UI16  (uint16)0x00C9

Ich habe 11 davon pro Hardwaremodul, insgesamt 6 module.
Um auf die einzelnen Register zuzugreifen, wird eine Struktur mit 
Pointern angelegt. 6 Strukturen werden in einem Array abgelegt.

Nun müssen die Pointer auf die Register "umgelenkt" werden, dafür gebe 
ich den die Adresse aus #define.

Ich bin noch bereit das 11 mal manuel zu tun, pro Hardwaremodul. Aber 66 
mal, ist mir zu viel. Kann ich irgendwie über #defines iterieren?

Klar kann ich die Adressen in ein zweidimensionales Array reinpacken, 
und über Indexe einfach durchlaufen, ist aber laut richtlinien 
unerwünscht :(

Habt ihr Vorschläge?

von Klaus W. (mfgkw)


Lesenswert?

Der C-Präprozessor kennt keine Schleifen.
Man kann Quelltext aber auch mit anderen Präprozessoren generieren
(m4, Shellskripte, ...).

von Karl H. (kbuchegg)


Lesenswert?

Wenn es Systematiken gibt, sind auch die Präprozessor Möglichkeiten 
'stringize' bzw. 'tokenize' oft hilfreich.

In aller Kürze.
Anstatt 66 mal die komplette Struktur per Hand runterzucode, den 
Präprozessor benutzen, so dass er aus einem #define zb die 11 
Definitionen für ein Hardwaremodul erzeugt.

Wenn du mal ein paar Beispiele zeigen würdest, könnte man dir zeigen wie 
das gehen könnte.

Wichtig: Du brauchst ein Benamungsschema, so dass sich diese Namen
SCI_SCI0BDL_ADR_UI16
nach einem Schema ergeben. Genauso die Pointernamen.

(Aber ich hab beim Lesen deiner Frage keine wirkliche Vorstellung davon 
bekommen, wie dein Aufbau ist)

von moOmb@ (Gast)


Lesenswert?

Lösung gefunden. Ich "klebe" meine defines zusammen mithilfe von einem 
makro. Funktioniert super.
So mach ich das:

...
#define GLUE(begin,id,end)\
begin##id##end

...
a =  GLUE(SCI_SCI,0,BDL_ADR_UI16);
b =  GLUE(SCI_SCI,1,BDL_ADR_UI16);


und über "id" iteriere ich in eine schleife. So :)
Danke an alle

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.