For-schleife will nicht anhalten!

Hi Leute,

auf die Gefahr hin, hier mal wieder ordentlich "uffe Fresse" zu bekommen, trau ich mich trotzdem mal, mit meinem aktuellen Problem zu fragen.

Also entweder ich bin total doof (wahrscheinlich ja :wink: oder es spukt in meinem Sketch:

Warum will die For-Schleife in get_values() nicht beim Jahr 2043 enden?

#include <Preferences.h>
Preferences prefs;

typedef struct {
  double wert_eins;
  double wert_zwei;
} test;

test testarray[20];

double wert_eins=0;
double wert_zwei=0;

void setup() {
  Serial.begin(115200);
  
  set_values(2021, 2.44, 12.44);
  set_values(2022, 3.44, 13.44);

  // Hier gelingt die Schleife
  for (uint16_t jahr = 2021; jahr <= 2042; jahr++) {
    Serial.println(jahr);
  }

  // Hier läuft HAARGENAU die gleiche Schleife munter übers Jahr 2042 hinaus
  get_values();

}

void loop() {
  // put your main code here, to run repeatedly:

}

void get_values() {
  // Werte ausgeben
  prefs.begin("settings", false);
    size_t schLen = prefs.getBytes("values_set", NULL, 0);
    char buffer[schLen];
    prefs.getBytes("values_set", buffer, schLen);
    memcpy(testarray, buffer, schLen);
    
    for (uint16_t jahr = 2021; jahr <= 2042; jahr++) {
      delay(1000);
      wert_eins=testarray[jahr-2021].wert_eins;
      wert_zwei=testarray[jahr-2021].wert_zwei;

      Serial.println("Jahr:" + (String)jahr + " --> Wert_eins:" + (String)wert_eins + ", Wert_zwei:" + (String)wert_zwei);
    }

  prefs.end();
}

void set_values(uint16_t jahr, double wert_eins, double wert_zwei) {
  // Werte speichern
  prefs.begin("settings", false);
    testarray[jahr-2021].wert_eins=wert_eins;
    testarray[jahr-2021].wert_zwei=wert_zwei;
    prefs.putBytes("values_set", &testarray, sizeof(testarray));
  prefs.end();
}

Sorry, peinlich - wahrscheinlich was ganz "banales" aber ich checks ned!!

So, nun darf losgeschossen werden :wink:

LG Daniel

Beschreibe den Fehler bitte genauer. Woran erkennst du ein „nicht enden“? Warum kommst du zu dem Schluss?

Sowas passiert u.a. wenn irgendwo Speicher/Variablen überschrieben werden.
Da ich nicht weiss, was da passiert rate ich mal:
Von 2021 bis 2043 sind mehr als 20.

1 Like

@plumbs

Hier hab ich ein Live-Beispiel:

Ab hier begreif ichs eben nicht mehr

@my_xy_projekt

So richtig hab ichs aber noch nicht gefressen.
Ich hab doch ne ganz klare Bedingung: Die for-Schleife soll laufen, bis jahr > = 2043 ist.
Wie kann da ein anderer Speicher mit reinspielen :partying_face:
Und vor allem: Was kann ich dagegen tun?

Wenn ich das hier mache, funktionierts

void get_values() {
  prefs.begin("settings", false);
    size_t schLen = prefs.getBytes("values_set", NULL, 0);
    char buffer[schLen];
    prefs.getBytes("values_set", buffer, schLen);
    memcpy(testarray, buffer, schLen);
    
    for (uint16_t jahr = 2021; jahr <= 2042; jahr++) {
      delay(1000);
      Serial.println(jahr);
      //wert_eins=testarray[jahr-2021].wert_eins;
      //wert_zwei=testarray[jahr-2021].wert_zwei;

      //Serial.println("Jahr:" + (String)jahr + " --> Wert_eins:" + (String)wert_eins + ", Wert_zwei:" + (String)wert_zwei);
    }

  prefs.end();
}

das bedeuted, dass das Auslesyen des Structs meine For-Schleife beleidigt.
Sorry, das schnall ich nicht.

Es darf doch nicht sein, dass ich jetzt die Größe des Arrays ändern muss, damit eine For-Schleife funktioniert.

Und Du überschreibst die Bedingung!

Die Grenze Deiner Elemente ist überschritten.
Bekommst Du keine Warnung vom Compiler?

1 Like

Nein, läuft problemlos durch.
Aber so was in der Richtung hatte ich glaub ich schon mal mit Arrays...

Aber tatsächlich, so funktionierts:

for (uint16_t jahr = 2021; jahr <= 2040; jahr++) {
      delay(500);
      wert_eins=testarray[jahr-2021].wert_eins;
      wert_zwei=testarray[jahr-2021].wert_zwei;

      Serial.println("Jahr:" + (String)jahr + " --> Wert_eins:" + (String)wert_eins + ", Wert_zwei:" + (String)wert_zwei);
 }

Danke @my_xy_projekt , you made my day...bzw. evening :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.