Ich steh gerade etwas auf dem Schlauch. Warum funktioniert angehängte If Abfrage wohl nicht ? Sollte doch eigentlich, oder?
byte att_dB, range ;
void setup()
{
// EEprom Werte einlesen
range = EEPROM.read(0);
att_dB = EEPROM.read(1);
delay(50);
// Fuer den allerersten Start vorbereiten (Wenn att_dB noch nicht gesetzt)
if (att_dB != 0 || att_dB != 3 || att_dB != 6 || att_dB != 10 || att_dB != 20
|| att_dB != 30 || att_dB != 40 || att_dB != 50 || att_dB != 60)
{
att_dB = 3; // default ATT 3 dB
range = 3; // default Range 2.2 GHz
eeprom_write_range();
delay(50);
eeprom_write_att_dB();
delay(50);
}
analogReference (INTERNAL2V56);
}
Steht nun z.B. 30 im EEprom ignoriert er das und schreibt mir wieder den default-wert 3 rein. Denn sollte er ja nur schreiben wenn nicht einer der Werte bereits gespeichert ist.
Über eine Hilfestellung würde ich mich freuen. Danke!
Beim Anblick der Oder-Orgie ging mir nur die Frage durch den ... äh ... die Watte, ob ein switch/case-Konstrukt mit ggf. umgekehrter Logik nicht verständlicher oder einfacher zu handhaben wäre. Evtl. ist das einen „echten“ Gedanken wert.
byte att_dB;
void setup()
{
Serial.begin(9600);
Serial.println(F("Los geht's"));
for (att_dB = 0; att_dB < 61; att_dB++) {
Serial.print(att_dB);
switch (att_dB) {
case 0:
case 3:
case 6:
case 10:
case 20:
case 30:
case 40:
case 50:
case 60:
Serial.println(F("\tStandardwert"));
break;
default:
Serial.println(F("\tkein Standardwert"));
}
}
}
void loop() {}
Vielen Dank an euch alle für die Hilfe und Kritik!
Klar ist alles Ansichtssache wie man die Abfrage gestaltet. Die array Variante von Tommy56 ist auch ne saubere Sache. Vorab habe ich aber nun einfach mal auf && umgestellt. Warum die oder (||) nicht funktioniert ist mir allerdings noch nicht ganz klar.
Zum Haupt-Problem:
Du prüfst auf UNGLEICHHEIT - und ver-ODER-st die Einzelprüfungen.
Wenn Etwas nicht UNGLEICH Drei ist, ist Es aber ganz bestimmt UNGLEICH Sechs - und da Du Diese Einzel-Prüfungen ver-ODER-st, ist Das IMMER wahr.
Denke, Das erkennt der Kompiler auch und optimiert die ganze Prüferei komplett weg - gibt's dabei keine Meldung wie 'unnötige IF'?
MfG
PS: Solche Spielereien würde ich erst im EEprom rumkratzen lassen, wenn der ausgiebige Test gezeigt hat, daß das EEprom Das auch zwei Tage überleben wird.
Die loop() ist schnell und wenn Du hier laufend irgendwo irgendwas reinschreibst, ist das EEprom dort irgend wann am Ende.
100.000 ist zwar nicht 'direkt', aber so viele Millisekunden braucht das EEprom nun auch nicht, um Das nicht in wenigen Minuten hin zu bekommen.
PPS: Ja - ich habe gesehen, daß dort bisher nur eine leere loop() steht - aber nicht heulend ankommen, wenn loop() fleißig war.
wenn A 0 ist, dann ist im ersten Teil die Bedingung nicht wahr, aber dann ist die Kontrolle sicher im zweiten Teil richtig da A nicht 3 ist weil A eben 0 ist. Darum ist die Bedingung dieses ifs immer für alle Werte wahr.
Wie Gesagt mußt Du auf == kontrollieren und AND Verknüpfen.
Das wäre die wörtliche Übersetzung von Deutsch nach Boolsche Algebra in C, nach meinem Verständnis.
Kann man natürlich auch anders formulieren und anders realisieren. wie schon gezeigt.
agmues switch gefällt mir übrigens am besten.
michael_x:
agmues switch gefällt mir übrigens am besten.
Mir gefällt der Array Funktion Ansatz am besten...
Noch etwas aufpeppen, dann lässt er sich für alles nutzen, wo es einen == Operator für gibt (oder man ihn bauen kann).
Also auch für Gießkannen, Mäuse und runde Ecken.
#include <Streaming.h>
//#include <CombieTypeTraits.h>
int testArray[] {1,5,55,4,2};
char kette[] {"Frosch"};
template<typename N, typename A>
bool isInArray(N needle,A &haystack)
{
// static_assert(is_array<A>(),"haystack ist not a Array");// anderes Thema
for(N &n:haystack) if(n==needle) return true;
return false;
}
void setup()
{
Serial.begin(9600);
Serial << "Start: "<< __FILE__ << endl;
Serial << "check 4: " << isInArray(4,testArray) << endl;
Serial << "check 42: "<< isInArray(42,testArray) << endl;
// Serial << "check 'A': "<< isInArray('A',testArray) << endl;// error
Serial << "check 's': "<< isInArray('s',kette) << endl;
Serial << "check 'x': "<< isInArray('x',kette) << endl;
}
void loop()
{
}