Forum: Mikrocontroller und Digitale Elektronik Variablenübergabe


von Sven W. (sickone4)


Lesenswert?

Hallo Leute,

ich hätte da mal eine Frage:

ich habe ein Unterprogramm geschrieben was einen Teil meines Programmes 
ausführt und welches ich mehrfach aufrufen möchte.

Dabei geht es um die Drehrichtung eines Motors.

die Parameter die ich dafür übergebe sind uint8 e1 und uint8 e2
stellvertretend für eingang 1 und eingang 2 am motortreiber.
1
void X( uint8_t e1, uint8_t e2 )

in meinem hauptprogram möchte ich nun dem Motor mitteilen in welcher 
Richtung er sich bewegen soll. beispielsweise geht das so:
1
X(0,1); // 1,0 = Links, 0,1 = Rechts

da ich das aber sehr irreführend finde fände ich das besser wenn da nur 
stehen würde
1
 X(links);

das möchte mein compiler (atmega studio 6) aber garnicht, weil er eben 2 
werte erwartet.

also habe ich mir gedacht mach ich das per define:
1
 #define links 1,0;

aber auch das geht nicht.

bisher war ich der annahme, dass die nach den bibliotheken definierten 
werte/variablen vom compiler beim brennen in den µC an entsprechenden 
stellen eingesetz werden. also wäre die annahme korrekt -> define (1,0) 
wird dann e1 und e2 zugeordnet. geht allerdings wie erwähnt nicht. gibts 
eine alternative, die das trotzdem möglich macht?

danke

gruß sven

von Jürgen (Gast)


Lesenswert?

> #define links 1,0;

Und wenn du das Semikolon wegnimmst?

von Karl H. (kbuchegg)


Lesenswert?

Sven Weinmann schrieb:


> wird dann e1 und e2 zugeordnet. geht allerdings wie erwähnt nicht. gibts
> eine alternative, die das trotzdem möglich macht?

Die andere Sache ist die:
Warum brauchst du überhaupt 2 Argumente?

Wenn links  1, 0   ist
und rechts  0, 1

dann ergibt sich doch der zweite Wert zwangsläufig aus dem ersten. 
Kennst du den ersten, kannst du den zweiten ganz leicht errechnen.

void X( uint8_t e1 )
{
  uint8_t e2 = 1 - e1;

  ....



Eine Funktion sollte nie "zu faul" sein, sich die Werte, die sie 
errechnen kann auch tatsächlich selbst zu bestimmen. Je weniger ein 
Aufrufer der Funktion wissen muss, je weniger sich der Programmierer 
merken muss um eine Funktion korrekt benutzen zu können, desto besser.

von xfr (Gast)


Lesenswert?

Warum übergibst Du nicht nur einen Parameter, der die Richtung 
beinhaltet?
1
#define RECHTS 0
2
#define LINKS 1
3
4
void X(uint8_t richtung)
5
{
6
  if (richtung == RECHTS) {
7
    // mach dies
8
  } else {
9
    // mach das
10
  }
11
}
12
13
int main(void)
14
{
15
  X(RECHTS);
16
}

Wenn es unbedingt die beiden Parameter sein sollen:
1
#define X_LINKS() X(1,0)
2
#define X_RECHTS() X(0,1)

von Karl H. (kbuchegg)


Lesenswert?

Jürgen schrieb:
>> #define links 1,0;
>
> Und wenn du das Semikolon wegnimmst?

Ohne es jetzt ausprobiert zu haben:
Das wird nicht helfen.

Wenn wir immer sagen, der Präprozessor macht Textersetzung, dann stimmt 
das nicht ganz. In Wirklichkeit macht er Textersetzung auf Tokenbasis. 
Und da kann sowas schon mal zu Problemen führen

Was aber natürlich gehen würde

#define XLinks()    X( 1, 0 )
#define XRechts()   X( 0, 1 )

aber eigentlich ist das auch zuviel der Ehre

1
#define DIR_LEFT   1
2
#define DIR_RIGHT  0
3
4
5
6
void X( uint8_t e1 )
7
{
8
  uint8_t e2 = 1 - e1;
9
  ...
10
}

von Jürgen (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ohne es jetzt ausprobiert zu haben:
> Das wird nicht helfen.

Warum nicht?

von Klaus W. (mfgkw)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ohne es jetzt ausprobiert zu haben:
> Das wird nicht helfen.

Ich habe es auch nicht probiert, aber wette dagegen...

von Jürgen (Gast)


Lesenswert?

@ Karl und Klaus

Was wettet ihr? Wie komme ich an den Gewinn?

von EGS_TI (Gast)


Lesenswert?

Da gehört kein Semikolon hin!

von Klaus W. (mfgkw)


Lesenswert?

Kiste Bier wäre gut, hole ich mir auch in Ö ab (falls ich richtig 
vermute, daß KHB da sitzt) - da muß ich sowieso in den nächsten Wochen 
mal hin.

von Klaus W. (mfgkw)


Lesenswert?

PS: ich rede natürlich von der Version ohne Semikolon, also etwa in der 
Art:
1
#define BLABLA 1, 42
2
...
3
  f( BLABLA );

von Sven W. (sickone4)


Lesenswert?

well the winner is jürgen :)

tatsächlich war das das problem!

von Jürgen (Gast)


Lesenswert?

Sven Weinmann schrieb:
> well the winner is jürgen :)
>
> tatsächlich war das das problem!

Karl, wo kann ich meine Kiste Bier abholen?

von Karl H. (kbuchegg)


Lesenswert?

Klaus Wachtler schrieb:
> Kiste Bier wäre gut, hole ich mir auch in Ö ab (falls ich richtig
> vermute, daß KHB da sitzt)

letzters stimmt.
Allerdings war ich mir nicht wirklich sicher und siehe da, da hab ich 
mich komplett verrant. Ich hatte da irgendein Problem mit der 
Token-Definition im Kopf - war aber mehr so ein unbestimmtes Gefühl - 
und komplett falsch.

> - da muß ich sowieso in den nächsten Wochen
> mal hin.

Wo gehts hin?

von Thomas E. (thomase)


Lesenswert?

Jürgen schrieb:
> Was wettet ihr? Wie komme ich an den Gewinn?
Da gibt es auch was zu gewinnen:
Beitrag "Re: [C] Merkwürdige Erscheinung"

Würde ich mir aber vorher zeigen lassen.

mfg.

von Klaus W. (mfgkw)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wo gehts hin?

In den kommenden Wochen werde ich zum einen einen Kumpel in Vils/Tirol 
heimsuchen, zum anderen in den kommenden Monaten evtl. mal Wien 
ansteuern; das ist aber noch unkonkret.

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.