Zählen im Präprozessor möglich?

Gast #2113518
Lesenswert?

Hallo zusammen,

mein aktuelles Projekt unterstützt zwei verschiedene Senortypen. Im 
Headerfile wird dabei ausgewählt, ob Sensor 1 bis Sensor 20 ein Feuchte- 
oder ein Temperatursensor ist.
Für den weiteren Ablauf benötige ich auch noch die Anzahl der 
aktivierten Feuchte- und Temperatursensoren.
Gibt es eine Möglichkeit die Anzahl der jeweiligen Sensoren im 
Präprozessor zu ermitteln, ohne diese explizit anzugeben? Im unten 
gezeigten Beispiel soll irgendwie den beiden defines ANZAHL_SENSOREN die 
Anzahl der jeweiligen Sensoren zugewiesen werden. Das soll automatisch 
passieren, damit bei einer Neukonfiguration nur die Sensortypen 
angepasst werden müssen und nicht auch noch die dann resultierende 
Anzahl der Sensoren (ausschliessen einer möglichen Fehlerquelle).

Leider fällt mir keine Möglichkeit ein das mit den im Präprozessor zur 
Verfügung stehenden Mittel zu realiseren.
Kennt ihr einen Trick mit dem das Vorhaben gehen könnte (ohne riesige 
#ifdef && #ifdef && #ifdef-Konstrukte)?
1
#define SENSOR_1_TYPE       FEUCHTE
2
#define SENSOR_2_TYPE       FEUCHTE
3
#define SENSOR_3_TYPE       TEMP
4
#define SENSOR_4_TYPE       FEUCHTE
5
#define SENSOR_5_TYPE       TEMP
6
.
7
.
8
#define SENSOR_20_TYPE       TEMP
9

10
// Diesen beiden defines soll automatisch der Wert 3 bzw. 2 zugewiesen 
11
// werden
12
#define ANZAHL_FEUCHTE_SENSOREN   3
13
#define ANZAHL_TEMP_SENSOREN      2

Ich nutze zwar den IAR Compiler und nicht den GCC, aber ich denke 
entweder geht das in beiden Präprozessoren oder in keinem.

Vielen Dank fürs Anschauen.

Dumpfi
Gast #2113557
Lesenswert?

Eine Lösung, die mir spontan einfällt, wäre die Worte "FEUCHTE" und 
"TEMP" mittels
1
#define FEUCHTE 1
2
#define TEMP    2

einen jeweils unterschiedliche Zweierpotenz zu geben
und dann mit einem Makro
1
#define SUM_FEUCHTE(X) ((X) & 1)
2
#define SUM_TEMP(X)    ((X) & 2)

sowie zweier Zeilen
1
#define ANZAHL_FEUCHTE_SENSOREN (SUM_FEUCHTE(SENSOR_1_TYPE) +...+ SUM_FEUCHTE(X))
2
#define ANZAHL_TEMP_SENSOREN    ((SUM_FEUCHTE(SENSOR_1_TYPE) +...+ SUM_FEUCHTE(SENSOR_20_TYPE))) >> 1)

die Summen zu bilden.

Voraussetzung ist natürlich, das Du FEUCHTE und TEMP nicht anders 
definieren musst. Je nach der tatsächlichen Definition findet sich aber 
vielleicht ein Weg die Summe anders zu bilden.
Gast #2113586
Lesenswert?

Ich dachte mir schon, dass es im Präprozessor keine schöne Möglichkeit 
gibt, das #define ANZAHL... automatisch berechnen zu lassen. Mit den in 
der Doku beschriebenen Befehlen fällt mir keine schöne Möglichkeit ein 
das zu realisieren. Ich hatte aber auf einen Trick gehofft, mit dem es 
trotzdem irgendwie geht.
Aber wenn Jörg keinen zu kennen scheint, dann heisst das für mich, dass 
es wohl keinen gibt ;-)

Gruß
Dumpfi
Gast #2113592
Lesenswert?

>Aber wenn Jörg keinen zu kennen scheint, dann heisst das für mich, dass
es wohl keinen gibt.

Es gibt das so einen Typ, der sich "Guru" nennt. Der hat hier auch was 
gepostet. Vielleicht nützt Dir das?
Gast #2113615
Lesenswert?

Hi Guru,

deine Lösung sieht echt gut aus. Genau auf so was hatte ich gehofft (und 
dann übersehe ich es auch noch. Peinlich, peinlich).

Ich werde das morgen früh gleich mal ausprobieren. Wie ich FEUCHTE und 
TEMP definiere kann ich frei wählen, so dass deine Lösung bei mir 
eigentlich super funktionieren müsste.

Vielen Dank dafür.

Gruß
Dumpfi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren