frage ich mich, ob man auch bei Temperaturabfragen auf if Kaskaden verzichten kann, um es übersichtlicher zu programmieren?
Die Temps liegen ja meist als float vor:
Z.B.
Wenn modusAuto = Ein && tempAussen > 15 Grad && tempAussen < 25 Grad && tempInnen < 20 Grad || tempInnen = 30 Grad dann tue etwas
Ich hatte erst switch case im Auge, aber nach meiner Suche kann man nur ganze Zahlen vergleichen.
Wäre es da sinnvoll, die floats in int zu wandeln?
Aber die hätten dann ja keine Kommastellen und würden erst beim nächsten ganzen Grad den Switch case erfüllen.
Oder macht man das ganz anders?
Hat da jemand eine Richtung für mich, in der ich gucken kann?
Ich würde,vor dem switch case, je nach Anzahl der Nachkommastellen, mit 10..100... multiplizieren, dann haste auch ganze Zahlen die Du auswerten kannst.
Notfalls ne Variable dafür mißbrauchen
Auf jeden Fall.
Normale Sensoren für Raumtemperatur haben ein halbes Grad Auflösung und noch weniger Genauigkeit. [OT] Die amerikanischen Fahrenheit haben immerhin den Vorteil, dass man da nie auf die Idee kommt, mit Bruchteilen zu rechnen [/OT]. Um leichter erkennbare Werte zu haben, nimm als Einheit Zehntelgrad, wie @combie woanders vorgeschlagen hat.
Zwischenruf:
Was für Sensoren benutzt Du und welche Lib dazu?
Für die Dallas-Temperature kannst Du das umrechnen ggfls. auch lassen und den Rohwert (ein int32_t ) weiterverwenden.
Denn der float TempC wird daraus errechnet.
Es macht ja keinen Sinn, den erst bauen zu lassen und dann wieder zurück zu rechnen.
Natürlich kann man, es ist aber zu sehen ob das logisch sinnvoll ist bzw daß beide Fälle überhaupt ausgeführt werden.
Das EVA ( Eingabe Verarbeitung Ausgabe) Prinzip hilft sicher dabei.
Wie man bei switch case die Variable auf Bereiche kontrollieren kann hat DIr combie in #6 gezeigt:
switch case geht nicht mit Überlappungen.
Da meckert der Compiler:
error: duplicate (or overlapping) case value
Was aber geht ist das aufteilen:
Variante 1:
switch (temp * 10)
{
case 220 ... 229:
// Tue etwas
break;
case 230 ... 239:
// Tue etwas
// Tue etwas anderes
break;
case 240 ... 249:
// Tue etwas anderes
// Tue noch etwas anderes
break;
case 250 ... 259:
// Tue noch etwas anderes
break;
default:
// Tue etwas ganz anderes
break;
}
Variante 2:
switch (temp * 10)
{
case 230 ... 239:
// Tue etwas anderes
case 220 ... 229:
// Tue etwas
break;
case 250 ... 259:
// Tue noch etwas anderes
case 240 ... 249:
// Tue etwas anderes
break;
default:
// Tue etwas ganz anderes
break;
}
Die zweite Variante macht sich zunutze, das ein fehlendes break überlaufen wird udn das nächste Case mitgenommen wird.
#include <string>
void operator "" _km(long double); // OK, will be called for 1.0_km
std::string operator "" _i18n(const char*, std::size_t); // OK
template<char...>
double operator "" _π(); // OK
float operator ""_e(const char*); // OK
// error: suffix must begin with underscore
float operator ""Z(const char*);
// error: all names that begin with underscore followed by uppercase
// letter are reserved (NOTE: a space between "" and _).
double operator"" _Z(long double);
// OK. NOTE: no space between "" and _.
double operator""_Z(long double);
// OK: literal operators can be overloaded
double operator ""_Z(const char* args);
int main() {}
Da sind explizit beide Varianten mit OK bezeichnet!