Forum: Mikrocontroller und Digitale Elektronik Welchen Typ Globaler Variable wird gebraucht?


von Al. K. (alterknacker)


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!

von Einer K. (Gast)


Lesenswert?

Woher sollen wir wissen, was du brauchst, wenn du das noch nicht mal 
selber weißt?

von Yalu X. (yalu) (Moderator)


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;}

von Einer K. (Gast)


Lesenswert?

? Glaskugelmodus ?
1
DCC_DIRECTION Richtung;
2
3
Richtung = Dir;

von Nick M. (Gast)


Lesenswert?

Was ist denn überhaupt eine "globale Auswertung"?

von Einer K. (Gast)


Lesenswert?

Nick M. schrieb:
> Was ist denn überhaupt eine "globale Auswertung"?

Meist: Eine ganz schlechte Idee!

von Al. K. (alterknacker)


Lesenswert?

Arduino Fanboy D. schrieb:
> Richtung = Dir;

...und was ist Dir für einen Typ,
damit ich die Variable Richtung definieren kann?

von Markus M. (adrock)


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

von Nop (Gast)


Lesenswert?

Diese deutsch-englisch-Mischung im Code verursacht bei mir einfach nur 
Brechreiz und ist üblicherweise auch ein zuverlässiger Indikator für 
vermurksten Code.

von Al. K. (alterknacker)


Lesenswert?

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!

von Lokführer (Gast)


Lesenswert?

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.

von Einer K. (Gast)


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?

von Nick M. (Gast)


Lesenswert?

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.

von Al. K. (alterknacker)


Lesenswert?

Nick M. schrieb:
> Daher wird das Programm auch auf "globale Auswertung" umgebaut.

..ach Nick du bist der Beste.

Du solltest ab und zu sinnvolle Vorschläge machen, nicht nur 
unterschwellig beleidigen wollen!

von Einer K. (Gast)


Lesenswert?

Fasse Kritik als Beleidigung auf.
Das lohnt sich....

von Al. K. (alterknacker)


Lesenswert?

Arduino Fanboy D. schrieb:
> Fasse Kritik als Beleidigung auf.
> Das lohnt sich....

wenn du es so siehst, kann ich es nicht bei dir Ändern.
Kritik mit Vorschlägen sind immer willkommen, aber nicht mit 
eingebetteten
unterschwelligen Beleidigungen.
Wenn auch manche schon hier zum  Sprachgebrauch gehören.

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Al. K. (alterknacker)


Lesenswert?

Danke für die ausführliche Erläuterung.
Eigendeich wollte ich die Variable nur aus LOOP zum I2C Grafikdisplay 
schicken,

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.