Welchen Typ Globaler Variable wird gebraucht?

OP #6020314
Lesenswert?

Hallo,
kleiner Auszug vom DCC Decoder!
1
void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
2
{
3
Speed_Wert=Speed;
4
GlobalAdr=  Addr;
5
//Richtung=DCC_DIRECTION;
6
  //AuswahlByte;//Bit1=ADR Speed Richtung
7
     if (bitRead(AuswahlByte,1) == 1)
8
     
9
     {
10
  Serial.print("notifyDccSpeed: Addr: ");
11
  Serial.print(Addr,DEC);
12
  Serial.print( (AddrType == DCC_ADDR_SHORT) ? "-S" : "-L" );
13
  Serial.print(" Speed: ");
14
  Serial.print(Speed,DEC);
15
  Serial.print(" Steps: ");
16
  Serial.print(SpeedSteps,DEC);
17
  Serial.print(" Dir: ");
18
  Serial.println( (Dir == DCC_DIR_FWD) ? "Forward" : "Reverse" );
19
  //Serial.println (Dir);// ? "Forward" : "Reverse" );
20
  //Serial.println (DCC_DIRECTION);// ? "Forward" : "Reverse" );
21
  
22
//  if (DCC_DIRECTION==1){Richtung=false;}
23
 // else ){Richtung=true;}
24
     }    
25
};
26
#endif

Ich möchte auch die Fahrtrichtung Global auswerten
//Richtung=DCC_DIRECTION;
,aber wie?

Dies geht Fehlerfrei.
 uint16_t Addr
uint8_t Speed,

Speed_Wert=Speed;
GlobalAdr=  Addr;

Der Typ ist bekannt!
Moderator #6020345
Lesenswert?

Ich habe zwar überhaupt nicht verstanden, was du vorhast, aber das
Problem liegt wohl darin, dass du in den auskommentierten Zeilen den
Typnamen DCC_DIRECTION wie eine Variable verwendest:

> //Richtung=DCC_DIRECTION;
> //  if (DCC_DIRECTION==1){Richtung=false;}

Vermutlich sollte hier anstelle des Typnamens DCC_DIRECTION der
Variablenname Dir stehen:

1
Richtung=Dir;
2
  if (Dir==1){Richtung=false;}
#6020379
Lesenswert?

Die globale Variable müsste vor allen Funktionen deklariert werden mit

DCC_DIRECTION G_Richtung;

- oder wie auch immer Du die Variable nennen willst. Ich nehme an 
Speed_Wert und GlobalAdr hast Du auch selbst hinzugefügt? Vlt. nennst Du 
sie dann analog in G_Adresse und G_Speed um bei der Gelegenheit?

In der Funktion muss dann stehen

G_Speed = Speed;
G_Adresse = Addr;
G_Richtung = Dir;

Warum das?

//  if (DCC_DIRECTION==1){Richtung=false;}
 // else ){Richtung=true;}

DCC_DIRECTION ist ja vermutlich ein enum Typ. Warum willst Du daraus mit 
Gewalt ein Boolean machen?

Abfragen kannst Du doch einfach mit

if (G_Richtung == DCC_DIR_FWD) {
  // mache was für vorwärts
}
else {
  // mache was für Rückwärts
}

Ist ja alles hier definiert:

https://github.com/mrrwa/NmraDcc/blob/master/NmraDcc.h
Gast #6020424
Lesenswert?

Al. K. schrieb:
> Arduino Fanboy D. schrieb:
>> Richtung = Dir;
>
> ...und was ist Dir für einen Typ,
> damit ich die Variable Richtung definieren kann?

Warum wohl, schreibe ich die Definition von Richtung direkt darüber?
Zum ignorieren?
Nee...
1
 void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
Da steht doch, dass der Type von Dir eindeutig DCC_DIRECTION ist.
Also sollte doch wohl Richtung auch von dem Type sein, dann bleiben dir 
implizite/explizite Casts erspart.

Was gefällt dir an der Typebezeichnung DCC_DIRECTION nicht?
Moderator Persönliche Seite #6021832
Lesenswert?

Al. K. schrieb:
> void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t
> Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )

Aus dieser Zeile liest man folgendes raus:

DCC_DIRECTION ist keine Variable, sondern der Typ der Variablen Dir.

Wenn man diese Richtung in einer globalen Variable namens "Richtung" 
speichern möchte, sollte diese Variable von demselben Typ sein.

Also definiert man eine globale Variable:
1
DCC_DIRECTION Richtung;

Innerhalb der Funktion notifyDccSpeed() kann man nun diese Variable mit 
dem aktuellen Wert von Dir füllen:
1
Richtung = Dir;

Den Wert von Richtung fragt man dann außerhalb der Funktion nicht mit 1 
oder 0 ab (was ist davon rückwärts, was vorwärts?), sondern mit dem 
vorgegenbenen Wert DCC_DIR_FWD.

Also: Wenn Richtung == DCC_DIR_FWD, dann gehts vorwärts, anderenfalls 
rückwärts.

Man kann aber auch den Source nach der Definition von DCC_DIR_FWD 
durchsuchen, wenn man den numerischen Wert tatsächlich braucht. Das 
scheint ein enum zu sein.

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