Forum: Compiler & IDEs Zählen im Präprozessor möglich?


von Dumpfi (Gast)


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

: Verschoben durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, der Präprozessor kann nicht direkt zählen.

von Guru (Gast)


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.

von Dumpfi (Gast)


Lesenswert?

Okay das dachte ich mir schon.
Vielen Dank.

Gruß
Dumpfi

von Guru (Gast)


Lesenswert?

>Okay das dachte ich mir schon.
Was dachtest Du Dir schon?

von Dumpfi (Gast)


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

von Guru (Gast)


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?

von Dumpfi (Gast)


Lesenswert?

AAAh sorry Guru.
Ich hatte deinen Beitrag gar nicht gesehen. Schau ich mir gleich mal an.

von Dumpfi (Gast)


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

von Dumpfi (Gast)


Lesenswert?

Hi Guru,

ich habe deine Lösung heute morgen ausprobiert und sie funktioniert 
wunderbar. Ich wäre da sicher nicht drauf gekommen.

Vielen Dank nochmal für deine Hilfe.


Gruß
Dumpfi

von Guru (Gast)


Lesenswert?

Bitte, gern' geschehen, Dumpfi.

Nett, das Du Rückmeldung gibst und Dich bedankst.

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.