Gültigkeitsbereich Variable

Frage zur Gültigkeit einer Variablen. Ist eine Variable, ich nenne sie "color" in einer if-Abfrage eine andere Variable als außerhalb dieser?
Deklariert ist sie vor dem Setup als
byte color ;

Dann könnte sie global gültig sein.
Mehr gibt Dein rudimentärer Code nicht her.

Gruß Tommy

In einem letzten Kapitel zur C++ Programmierung habe ich gelernt, das gleichnamige lokale Variablen Vorrang haben vor den globalen Variablen. Also ja, das ist dann eine neue Variable, wenn du sie im Block neu deklarierst. Man kann aber über einen Zusatz auch auf die globale Variable zugreifen.

Aber wie Thommy schon schrieb, ein Code dazu würde viel Raten ersparen.

Der Teil sieht so aus:

    if (weissStatus == LOW) {                            // ein Taster wird nach GND gelegt
      uint8_t color = analogRead(poti) / 4;      // A0 wird eingelesen
      Serial.print(color);
      Serial.print("   ");
      faerbeLeds(color, 255, 255);
    }
    Serial.print("Color =  ");
    Serial.println(color);

Die Ausgabe beim betätigen sieht im seriellen Monitor dann so aus.

Unbenannt

Warum könnte? Ich war mir eigentlich sicher, nachdem, was ich so gelesen habe.

64 ist der Wert der lokalen Variable color.
160 ist der Wert der globalen Variable color.

Edit: Ha, gefunden. Mit :: vor der Variable kannst du auf die globale Variable zugreifen, wenn eine gleichnamige lokale Variable aktiv ist.


if (weissStatus == LOW) {                            // ein Taster wird nach GND gelegt
      uint8_t color = analogRead(poti) / 4;      // A0 wird eingelesen
      Serial.print(color);
      Serial.print(" <- Lokal / Global -> "); 
      Serial.print(::color);
      Serial.print("   ");
      faerbeLeds(color, 255, 255);
    }
    Serial.print("Color =  ");
    Serial.println(color);

byte color = 55; // globale Variable

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
}

void loop()
{
  if (color == 55) // globale Variable
  {
    uint8_t color = analogRead(A0) / 4;  // lokale Variable
    Serial.print("lokale Variable: ");
    Serial.print(color);
    Serial.print("   ");
  }
  Serial.print("globale Variable: ");
  Serial.println(color);                 // globale Variable
  delay(1000);
}

Genau, das ist die Erklärung. :slightly_smiling_face:

Vielleicht verdeutlicht dieser Code auch nochmals die Gültigkeit:

byte test = 50;

void setup(){
  Serial.begin(9600);
  byte test = 55;
  if(test == 55){
    byte test = 60;
    if(test == 60){
      byte test = 65;
      Serial.print("test(lokal_3): ");Serial.println(test);
      Serial.print("test(global): ");Serial.println(::test);
    }
    Serial.print("test(lokal_2): ");Serial.println(test);
    Serial.print("test(global): ");Serial.println(::test);
  }
  Serial.print("test(lokal_1): ");Serial.println(test);
  Serial.print("test(global): ");Serial.println(::test);
}

void loop(){}

Monitor:

22:35:51.739 -> test(lokal_3): 65
22:35:51.786 -> test(global):  50
22:35:51.786 -> test(lokal_2): 60
22:35:51.833 -> test(global):  50
22:35:51.833 -> test(lokal_1): 55
22:35:51.833 -> test(global):  50

Im Gültigkeitsbereich von der zweiten/dritten lokalen gleichnamigen Variable habe ich keinen Zugriff auf die davor liegenden gleichnamigen lokalen Variablen. Oder ist dies doch möglich? Frage an die Profis.

Edit: Es ist natürlich viel Sinnvoller einfach andere, aussagekräftigere Namen zu nutzen, als gleiche Namen.

Danke sehr, habe es hinbekommen.
Habe jetzt meinen Sketch für mein "Laserschwert" mit millis zum laufen bekommen.
Danke an alle...

Die richtige Bezeichnung ist hier "Sichtbarkeit" (visibility).

Sonst wird es vor allem lustig, wenn man anfängt, Variablen in Namespaces zu verstecken.