Hallo liebe Programmiergemeinde,
ich habe vermutlich einen Pufferüberlauf in meiner Ventilatorsteuerung mit meinem Arduino Mega und ich weiß nicht, wie ich das Problem eingrenzen soll.
Ich schreibe in eine Variable einen Text. Dieser erscheint dann nach einer Weile in einer anderen, eigentlich konstanten Variable. Sieht für mich nach Pufferüberlauf aus. Da ich den Inhalt der Variable mit snprintf() schreibe, dürfte das doch eigentlich nicht passieren?
Was meint ihr, was sonst als Ursache in Frage kommt und habt ihr eine Idee, wie ich den Fehler eingrenzen kann?
Hier im Detail:
Ich habe eine Klasse ‚cStatus‘ definiert. Diese hat als Eigenschaft u. a. einen String ‚char statusString[145]‘, der nur in der Funktion ‚switchVent()‘ der Klasse beschrieben wird:
class cStatus {
public:
...
char statusString[145] = "";
bool switchVent();
void getLCDstrA(char*LCDstr,byte len=0);
bool isVentOn();
}
bool cStatus::switchVent() {
...
snprintf(this->statusString, 145, " ... [diverse Formatangaben] ...",
[diverse Byte-, Integer- und Stringvariablen]
);
}
In der Funktion ‚getLCDstrA‘ dieser Klasse habe ich zwei lokale, konstante Strings definiert, die nicht verändert werden. Das Funktionsergebnis wird im Hauptprogramm loop() für eine Displayausgabe verwendet:
void cStatus::getLCDstrA(char*LCDstrA, byte len) {
const char txtOn[4] =" An";
const char txtOff[4]="Aus";
...
snprintf(LCDstrA, len, "%02d:%02d:%02d -- -- %s ",
hour(), minute(), second(),
this->isVentOn() ? txtOn : txtOff
);
...
}
Nachdem das Programm eine Weile korrekt läuft ändert sich der Inhalt des konstanten Strings ‚txtOn‘ und ‚txtOff‘ und somit der Display-Ausgabe. Dort finden sich dann plötzlich Inhalte aus dem ‚statusString‘. Irgendwann schmiert das gesamte Programm ab.
Für mich war das eindeutig ein Pufferüberlauf beim Beschreiben ‚statusString‘, d.h. es wird mehr in den String geschrieben als die zuvor definierten 145 Zeichen und damit in den Speicherbereich von ‚txtOn‘ und ‚txtOff‘ hinen. Aber ich dachte die Funktion snprintf() sollte sowas abfangen. Somit bin ich mit meine Ideen der Ursachensuche am Ende.
Ich könnte mir vorstellen, dass irgendwo im Programmspeicher die Adresse der beiden lokalen Variablen ‚txtOn[4]‘ und ‚txtOff[4]‘ manipuliert wird, und daher fälschlicherweise Werte aus dem Speicherbereich des Status ausgegeben werden. Aber wie kann sowas passieren und wie grenze ich den Fehler ein?
Danke schonmal für eure Unterstützung!