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 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
LG Daniel
Plumps
October 26, 2022, 4:11pm
2
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.
basementmedia:
test testarray[20];
1 Like
@plumbs
Hier hab ich ein Live-Beispiel:
Run IoT and embedded projects in your browser: ESP32, Arduino, Pi Pico, and more. No installation required!
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
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!
basementmedia:
test testarray[20];
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
system
Closed
April 24, 2023, 5:20pm
7
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.