www.mikrocontroller.net

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


Autor: Dumpfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)?
#define SENSOR_1_TYPE       FEUCHTE
#define SENSOR_2_TYPE       FEUCHTE
#define SENSOR_3_TYPE       TEMP
#define SENSOR_4_TYPE       FEUCHTE
#define SENSOR_5_TYPE       TEMP
.
.
#define SENSOR_20_TYPE       TEMP

// Diesen beiden defines soll automatisch der Wert 3 bzw. 2 zugewiesen 
// werden
#define ANZAHL_FEUCHTE_SENSOREN   3
#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 Moderator
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Guru (Gast)
Datum:

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

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

sowie zweier Zeilen
#define ANZAHL_FEUCHTE_SENSOREN (SUM_FEUCHTE(SENSOR_1_TYPE) +...+ SUM_FEUCHTE(X))
#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.

Autor: Dumpfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay das dachte ich mir schon.
Vielen Dank.

Gruß
Dumpfi

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Okay das dachte ich mir schon.
Was dachtest Du Dir schon?

Autor: Dumpfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Dumpfi (Gast)
Datum:

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

Autor: Dumpfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dumpfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte, gern' geschehen, Dumpfi.

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.