Problem beim Übertragen von String in globale Variable

Hallo zusammen,

ich arbeite gerade an einem Projekt, für dass ich die Wettervorhersage von Open Weather Map nutze. Hierzu habe ich ein eigenes void angelegt. Die Daten empfange ich und auch das Parsen der Daten aus der JSON funktioniert Problemlos.

Beispiel: String  iconNow = root["current"]["weather"][0]["icon"];

Das Problem ist jetzt, dass ich genau diesen String "iconNow" in einem anderen Void brauche, ich dort jedoch den Fehler "iconNow was not declared in this scope" erhalte.

Wenn ich nun

String iconNow = "";

als globale Variable setze, kommt jedoch nichts an, der String bleibt leer.

Ich habe das Problem einmal simplifiziert in diesem Sketch dargestellt.

String test = "";

void setup() {
  Serial.begin(9600);

}

void loop() {
  test1();
  delay(5000);
  test2();

}

void test1(){
  String test = "Es funktioniert!";
}


void test2(){
  Serial.print("Das hier steht da:");
  Serial.println(test);
}

Auch hier bleibt der String test leer. Nur wenn ich die Deklarierung "String" aus void test1() entferne, funktioniert es. Im Originalcode nutze ich jedoch die Bibliothek ArduinoJSON.h, weshalb ich hier die Deklarierung String benutzen muss, sonst bekomme ich einen Fehler.

Wie bekomme ich den Wert des Strings iconNow bzw. des Strings test in die Globale Variable, damit ich sie in einem anderen void nutzen kann?

Vielleicht ist es ja offensichtlich und ich sehe es einfach nicht.

Vielen Dank

Es gibt keine "voids". Void ist ein Datentyp. Die Dinger sind Funktionen

void test1(){
  String test = "Es funktioniert!";
}

Das ist eine lokale Variable test die die globale Version überdeckt

Okay, also muss ich die lokale Variable irgendwie Global machen.

So geht's, ist aber irgendwie nicht elegant, besonders wenn ich 20 Werte übertragen muss:

String testNow = "";

void setup() {
 Serial.begin(9600);

}

void loop() {
 test1();
 delay(5000);
 test2();

}

void test1(){
 String test = "Es funktioniert!";
 testNow = test;
}


void test2(){
 Serial.print("Das hier steht da:");
 Serial.println(testNow);
}

crosswalkersam:
So geht's, ist aber irgendwie nicht elegant, besonders wenn ich 20 Werte übertragen muss:

dann nimmst du ein Array, statt einer Variablen.

Kann ich in ein Array auch Daten verschiedener Art reinschreiben? Einige von den Variablen sind Strings, andere floats oder einige int

Dafür gibt es Strukturen

crosswalkersam:
Kann ich in ein Array auch Daten verschiedener Art reinschreiben? Einige von den Variablen sind Strings, andere floats oder einige int

Nein. Was Du tun kannst: Wenn Du unterschiedliche Daten zu einer Struktur (Schlüsselwort struct) zusammenfasst, kannst Du ein Array aus solchen „Datenpaketen“ anlegen.

Gruß

Gregor

Okay, vielen Dank. Das mit den Arrays hört sich interessant an. Aber auch dann erzeuge ich doch nur ein lokales Array, oder? Wie mach ich das dann Global?

crosswalkersam:
Okay, vielen Dank. Das mit den Arrays hört sich interessant an. Aber auch dann erzeuge ich doch nur ein lokales Array, oder? Wie mach ich das dann Global?

Indem Du es außerhalb aller Blöcke (also z. B. noch vor setup()) deklarierst. Dann ist es von loop() und anderen Funktionen aus „sichtbar“ (global eben).

Gruß

Gregor

Und in dieses Global deklariere Array kann ich aus meinem void reinschreiben und es ineinem anderen void wieder auslesen?

Tut mir leid, dass ich so doof Frage, aber es ist mein erstes mal mit den Dingern :slight_smile:

crosswalkersam:
Und in dieses Global deklariere Array kann ich aus meinem void reinschreiben und es ineinem anderen void wieder auslesen?

Ja. Probier's aus. Der Punkt ist, dass Variablen, die sich innerhalb eines Blocks (alles zwischen { und }) befinden, auch nur innerhalb dieses Blocks sichtbar sind („scope“).

Tut mir leid, dass ich so doof Frage, aber es ist mein erstes mal mit den Dingern :slight_smile:

Mach Dir nichts draus. Ich bin manchmal vollkommen unabsichtlich unglaublich dämlich. Ganz ohne Drogen.

Gruß

Gregor

Habs gerade versucht und siehe da: funktioniert. Vielen, vielen Dank! 8)

crosswalkersam:
Habs gerade versucht und siehe da: funktioniert. Vielen, vielen Dank! 8)

Gern geschehen. Immerhin habe ich den Beginn des Wochenendes auf heute ... äh ... gestern vorgezogen.

Was Du „voids“ nennst, sind übrigens Funktionen. „void“ steht vor dem Funktionsnamen und bedeutet lediglich, dass die betreffende Funktion keine Rückgabe liefert.

Gruß

Gregor

crosswalkersam:
meinem void

Void ist ein Datentyp: