...tja wie soll ich es beschreiben? Geht nicht mehr?!

Moin,

ich versuche es mal auf die kurze Art und versuche euch ne Menge Code zu ersparen. Fang ich mal langsam an:

Sind folgende Zeilen korrekt, oder kann man das besser machen?

  if (LiterProStunde != NULL)                // nur wenn "LiterProStunde" anders ist als NULL, dann bei jedem Schleifendurchlauf "LiterSeitStart" um 0,5 erhoehen
    LiterSeitStart += 0.5;

Die Fehlermeldung sieht so aus:

warning: NULL used in arithmetic [-Wpointer-arith]

if (LiterProStunde != NULL) // nur wenn “LiterProStunde” anders ist als NULL, dann bei jedem Schleifendurchlauf “LiterSeitStart” um 0,5 erhoehen

^

exit status 1
Fehler beim Kompilieren für das Board NodeMCU 1.0 (ESP-12E Module).

So, nu das komische.
Der gesamte Sketch kompiliert und läuft ohne Probleme.
Dann wollte ich das Sketch für Andreas Spiess’ IOTAppStory.com mit seiner VirginSoil-Basic erweitern.
Haba also die paar Zeilen hinzugefügt.
Und nun kommt so ein Fehler im Teil des alten Codes.

Ja, gut, ich bin ein bischen schnell mit dem Einstieg ins Thema.
Also Andreas Spiess hat ein Online Dashboard entwickelt, mit dem man komfortabel die Sketches in verschiedenen Versionen komfortabel auf z.B. nodeMCUs verteilen kann.
Das versuche ich seit heute intensiv. Es hat aoweit auch schon sehr gut mit 4 nodeMCUS geklappt. Dann habe ich mein eigenen Test Blink Sketch um die Zeilen des VirginSoil-Basic erweitert, damit ich das Dashboard nutzen kann. Funktioniert.
Mach ich das gleiche mit meinem Displaysketch kommt plötzlich die Fehlermeldung, mit der ich nichts anfangen kann.

Ich weiss, das ist jetzt alles etwas viel und trotzdem wahrscheinlich nicht gut erklärt. Aber fangen wir mal mit meiner ersten Frage ganz oben an. Was läuft da falsch?
Der gesamte Code ist 660 Zeilen lang und hat kompiliert.
Nach hinzufügen von folgenden Zeilen (natürlich ohne Setup und Loop) kommt plötzlich der obenstehende Fehler.

#define COMPDATE __DATE__ __TIME__
#define MODEBUTTON 0										// Button pin on the esp for selecting modes. D3 for the Wemos!
#include <IOTAppStory.h>								// IotAppStory.com library
IOTAppStory IAS(COMPDATE, MODEBUTTON);	// Initialize IotAppStory

void setup() {
  IAS.begin('P');         // Optional parameter: What to do with EEPROM on First boot of the app? 'F' Fully erase | 'P' Partial erase(default) | 'L' Leave intact
  //-------- Your Setup starts from here ---------------
}

// ================================================ LOOP =================================================
void loop() {
  IAS.loop();				// this routine handles the reaction of the MODEBUTTON pin. If short press (<4 sec): update of sketch, long press (>7 sec): Configuration
  //-------- Your Sketch starts from here ---------------
}

Lieben Gruß,
Chris

Sind folgende Zeilen korrekt, oder kann man das besser machen?

Sind nicht korrekt, und natürlich kann man es besser machen.

NULL ist ein Pointer, den du vermutlich mit etwas vergleichst, was kein Pointer ist.

NULL, 0 und 0.0 sind drei verschiedene Sachen.

Ohne Variablendefinition ist alles nur Raterei.

aha, okay

double LiterProStunde;

Lieben Gruß, Chris

Merksatz: Vergleiche niemals Float mit anderen Zahlen auf Gleichheit oder Ungleichheit. (überraschende Ergebnisse das bringt)

Böser Vergleich:

if (LiterProStunde != 0) if (LiterProStunde != 0.0)

Wenn dir nicht klar ist warum, dann schaue dir an wie Floats imlementiert sind.

Aha, das erklärt tatsächlich ein Verhalten, dass ich nicht verstanden habe. Manchmal würde der Zähler ganz oft ausgelöst und ich habe nicht verstanden warum. Ich ahne warum, weil sie eine endliche Genauigkeit haben?!

Ich möchte eine Aktion auslösen, wenn das double ungleich 0 ist. Wie krieg ich das denn mit einem double hin?

Lieben Gruß, Chris

themanfrommoon: Wie krieg ich das denn mit einem double hin?

Mit einer Relation. Bei Reference > Language > Variables > Data types > Float lese ich: "Floating point numbers are not exact, and may yield strange results when compared. ... You should instead check that the absolute value of the difference between the numbers is less than some small number."

themanfrommoon: Ich möchte eine Aktion auslösen, wenn das double ungleich 0 ist. Wie krieg ich das denn mit einem double hin?

Hallo, überlege noch einmal in aller Ruhe. Es wurde alles gesagt, musst nur noch 1 und 1 zusammenziehen. Was bedeutet ungleich 0? Wie kann man das anders formulieren? Ein Verbrauchswert L/h kann eigentlich nur positiv sein. Demzufolge kannst du auf größer 0 vergleichen und erschlägst alles. Wenn er doch negativ werden kann vergleichst du noch auf kleiner 0 mit ODER Verknüpfung. double ist bei uns gleich mit float.

Kommt ein wenig darauf an, woher der Wert stammt und ob 0.00000 ein Sonderfall ist. Wenn nicht, wenn also 0.0 eher bedeutet,dass der Wert "in Wirklichkeit" irgendwas zwischen -0.01 und +0.01 (z.B.) ist, dann schreib das auch so.

if (LiterProStunde > 0.005) // nur bei echtem Durchfluss

Andererseits ist 0.0 ein eindeutiges Bitmuster bei einer double Variablen

Die Fehlermeldung sieht so aus:

Das ist kein Fehler, sondern eine Warnung. Manche Warnungen kann man ignorieren. Aber andere sind eigentlich schon Fehler und weisen auf diese hin

Float/double mit NULL zu vergleichen ist natürlich Unsinn. NULL verwendet man nur bei Zeigern

....irgendwas ist hier komisch. Ich bin von Win 7 auf Win 10 mit einem neuen Rechner umgestiegen. Nun habe ich die IDE 1.8.7 und ein paar Bibliotheken neu installiert. Und nun kriege ich immer mehr Probleme mit Sketches die vorher funktioniert haben. Und zwar zicken die jetzt mit diesem "NULL" rum. Ich habe den Eindruck, dass "NULL" jetzt irgendwie anders definiert ist.

Hier ist schon die nächste Warnung:

warning: passing NULL to non-pointer argument 2 of 'void* memset(void*, int, size_t)' [-Wconversion-null]

     memset(timestamp, NULL, sizeof(timestamp));

Die Funktion will int, du übergibst NULL. Schreib 0 und schon geht es. NULL und 0 sind gleich wenn es um Zeiger geht. Aber nicht bei Integern. Da will dich der Compiler dazu zwingen deutlicher zu sein.

In diesem Fall mag das keine Rolle spielen. Aber denke mal darüber nach was passiert wenn du überladene Funktionen hast. Einmal mit einem Zeiger und einmal einem Integer als Parameter.

Das ist auch so ein Grund weshalb C++11 nullptr eingeführt hat. Damit gibt es diese Vieldeutigkeiten nicht

Du hattest vorher eine ältere Version, oder weniger Warnungen eingestellt, und dir ungestraft den Unsinn mit NULL statt 0 angewöhnt. Soll ich Mitleid haben? :)

Nee, da brauche ich kein Mitleid, danke. Man könnte denken, dass ich programmieren könnte. In Wirklichkeit hangel ich mich immer mit Hilfe des Forums so durch. Ausgedacht habe ich mir das sicherlich nicht alleine mit der NULL ;-) Aber ich bim immer sehr froh wenn es Leute wie euch gibt, die so tief da drinstecken, dass sie das sogar jemand anderem erklären können. Ich hangel mich mal weiter.

Lieben Gruß und lieben Dank, Chris

Ich hangel mich mal weiter.

Du könntest auch “schreiten” …

themanfrommoon: Nee, da brauche ich kein Mitleid, danke. Man könnte denken, dass ich programmieren könnte. In Wirklichkeit hangel ich mich immer mit Hilfe des Forums so durch. Ausgedacht habe ich mir das sicherlich nicht alleine mit der NULL ;-) Aber ich bim immer sehr froh wenn es Leute wie euch gibt, die so tief da drinstecken, dass sie das sogar jemand anderem erklären können. Ich hangel mich mal weiter.

Lieben Gruß und lieben Dank, Chris

Also einen Integervergleich (oder gar float) mit NULL hat dir hier garantiert keine empfohlen.

Immer wieder mein Tip -> erst C (und/oder C++) lernen auf dem PC und dann auf die armen Microcontroller losgehen.

Ulli