Welchen Typ Globaler Variable wird gebraucht?

OP #6020314
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
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;}
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
Diese deutsch-englisch-Mischung im Code verursacht bei mir einfach nur 
Brechreiz und ist üblicherweise auch ein zuverlässiger Indikator für 
vermurksten Code.
OP
if (Dir == DCC_DIR_FWD)
{
 Richtung= 0;
}
else
{
    Richtung=1;
}

Is mir auch eingefallen das ich es schon früher genutzt habe.
Trotzdem Danke.

Nur zu meinen Verständnis
typ xx DCC_DIRECTION
typ yy Dir

Damit ich die Auswertung von xx oder yy auserhalb der Funktion machen 
kann!
Gast
Warum packst du die Fahrtrichtung nicht dahin, wo sie hingehört?
Bei 127 Fahrstufen in Bit 7 und bei 28 Fahrstufen in Bit 5 des 
Geschwindigkeitsbytes.
Gast
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?
Gast
Arduino Fanboy D. schrieb:
> Was gefällt dir an der Typebezeichnung DCC_DIRECTION nicht?

Da kommt doch sonst jeder Depp drauf, was gemeint ist. Vor allem, wenn 
es nur einen einzigen Typen für die Richtung gibt. Tztztztztz!

Daher wird das Programm auch auf "globale Auswertung" umgebaut.
Moderator Persönliche Seite
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.