Forum: Mikrocontroller und Digitale Elektronik Funktionen nur verfügbar machen, wenn name defined ist


von Frank (Gast)


Lesenswert?

Hallo,
ich möchte gerne in der haupt-datei eine variable definieren.
#define master
oder
#define slave
In einer anderen Datei habe ich funktionen, die entweder nur für ein 
master oder nur für ein slave bestimmt sind. auch die init-funktion 
unterscheidet sich.
Was muss ich machen, wenn ich in der datei mit den funktionen nur die 
passenden funktionen freigeben möchte?

also im prinzip
1
#if defined(master)
2
void init(){
3
...
4
}
5
6
void send(unsigned char *cdata){
7
...
8
}
9
10
11
#else if defined(slave)
12
void init(){
13
...
14
}
15
16
void receive(){
17
...
18
}
19
#endif

Das größte Problem habe ich, die variable aus der haupt-c-datei in der 
funktions-c-datei kenntlich zu machen.

von Karl M. (Gast)


Lesenswert?

Hallo Frank,

vielleicht fehlen Dir da noch die grundlegenden Dinge, wie man 
C-Projekte anlegt?

Also da sind die H- und die C-Dateien für eine C-Projekt.

Frage Dich bitte, was man wo hinschreibt.

Und was hat ein Makefile damit zu tun ?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Karl M. schrieb:
> Und was hat ein Makefile damit zu tun ?

Öh, Brille verlegt? Von Makefile hat der TE gar nix gesagt.

Frank schrieb:
> die variable aus der haupt-c-datei

Das ist der Fehler. Mache eine z.B. 'setup.h' und definiere da deine 
defines. Die Datei bindest du dann in alle deine *.c und *.h ein, die 
die defines brauchen.

von Frank (Gast)


Lesenswert?

Matthias S. schrieb:
> Frank schrieb:
>> die variable aus der haupt-c-datei
>
> Das ist der Fehler. Mache eine z.B. 'setup.h' und definiere da deine
> defines. Die Datei bindest du dann in alle deine *.c und *.h ein, die
> die defines brauchen.

Ah, doch so einfach :)
Da wäre ich so schnell wirklich nicht drauf gekommen.
Danke dir

von Frank (Gast)


Lesenswert?

Habe jetzt die setup.h gemacht und in der funktions-c-datei eingefügt.
den Befehl
#ifdef Master
wird auch erkannt, aber die elseif bedingung bekomme ich nicht hin
#elif SLAVE
-> errormeldung: #elif with no expression

#elsif
#elseif
#elseifdef
#elseifdefined
#elsifdef
#elsifdefined

kennt der alle nicht

#else
 #error "Master oder Slave nicht gewaehlt"

wird wieder erkannt

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

https://de.wikibooks.org/wiki/C-Programmierung:_Pr%C3%A4prozessor#.23elif

Oder lies ein gutes C-Buch anstatt zu rätselraten.
Komische Vorgehensweise hast Du.

von aSma>> (Gast)


Lesenswert?

https://de.wikibooks.org/wiki/C-Programmierung:_Pr%C3%A4prozessor

Füge mal deine ganze datei im Anhang, dann wird dir auch effizient 
geholfen.

Wenn du eng. kannst, dann übersetze mal.

von Ralf G. (ralg)


Lesenswert?

Alternativ übergibt man sowas in den Projekteinstellungen (so, wie auch 
FCPU), dann braucht man die Definitionen nicht in jedes Modul einzeln 
einzubinden. Wie? Das kommt jetzt auf dein Entwicklungssystem an...

von Willi (Gast)


Lesenswert?

1
#define MASTER 0
2
#define SLAVE 1
3
4
#define BAUGRUPPE MASTER // oder halt SLAVE
5
6
// in der Baugruppe
7
8
#if (BAUGRUPPE == MASTER)
9
10
#elseif (BAUGRUPPE == SLAVE)
11
12
#else
13
  #warning Baugruppe nicht definiert
14
#endif

von Rene Krüger (Gast)


Lesenswert?

Oder:
1
#define Master
2
3
#ifdef Master
4
  //Master Zeugs
5
#elif defined Slave
6
  //Slave Zeugs
7
#endif

Das müsste mit jedem ANSI kompatibelem C Compiler gehen.

von Georg (Gast)


Lesenswert?

Rene Krüger schrieb:
> Das müsste mit jedem ANSI kompatibelem C Compiler gehen

Den Befehl #elif kenne ich nicht - aber ich lasse mich von dir gern 
belehren. Wo ist das definiert?

Georg

von Mikro 7. (mikro77)


Lesenswert?

Georg schrieb:

> Den Befehl #elif kenne ich nicht - aber ich lasse mich von dir gern
> belehren. Wo ist das definiert?

Wo sind denn die anderen Präprozessordirektiven definiert? Da schon 
geguckt?! /SCNR

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg schrieb:
> Den Befehl #elif kenne ich nicht - aber ich lasse mich von dir gern
> belehren. Wo ist das definiert?

Das kann z.B. der AVR-GCC:
1
#if (CONTROL_INPUT == CONTROL_FROM_CONSOLE)
2
  DDRD = _BV(REV_ROTATION_PIN) | _BV(EMERGENCY_SHUTDOWN_PIN ) | _BV(MAIN_RELAY_PIN ); 
3
// Set Shutdown
4
//  PORTD |= (_BV(EMERGENCY_SHUTDOWN_PIN)); 
5
#elif (CONTROL_INPUT == CONTROL_FROM_PORTS)
6
  DDRD = _BV(REV_ROTATION_PIN) | _BV(EMERGENCY_SHUTDOWN_PIN ) | _BV(MAIN_RELAY_PIN ); 
7
  // Enable pull-up on direction signal.
8
  PORTD |= _BV(DIRECTION_COMMAND_PIN) ;
9
#endif

von Rene Krüger (Gast)


Lesenswert?

Georg schrieb:
> Den Befehl #elif kenne ich nicht - aber ich lasse mich von dir gern
> belehren. Wo ist das definiert?
>
> Georg

https://gcc.gnu.org/onlinedocs/cpp/Elif.html

von Georg (Gast)


Lesenswert?


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.