genau das wollte ich vermeiden da ich mehrere werte zu überprüfen habe
und die if somit kilometerlang wird :-/
aber wenn das die einzige möglichkeit ist bleibt mir nichts anderes.
Dankeschön.
Mike schrieb:> genau das wollte ich vermeiden da ich mehrere werte zu überprüfen> habe> und die if somit kilometerlang wird :-/> aber wenn das die einzige möglichkeit ist bleibt mir nichts anderes.> Dankeschön.
Dann mach doch eine Funktion, der du "wert" als Variable übergibst. In
der Funktion prüfst du dann auf die Grenzwerte und gibst "true" oder
"false" zurück. Je nachdem, ob "wert" innerhalb oder außerhalb der
Grenzen liegt.
Mike schrieb:> genau das wollte ich vermeiden da ich mehrere werte zu überprüfen habe> und die if somit kilometerlang wird :-/
Wie wäre es, wenn du deine zu überprüfenden Daten in ein Array packst
und den Vergleich in einer Schleife ausführst. Dann muss der Prozessor
allenfalls stundenlang in der Programmschleife durch das Array toben.
Mike schrieb:> genau das wollte ich vermeiden da ich mehrere werte> zu überprüfen habe und die if somit kilometerlang> wird :-/
Nicht unbedingt.
Wahrheitswert explizit in Variable speichern. In Schleife
Wert und Intervall aus Tabelle/Array lesen, neuen Wahrheitswert
bestimmen, mit altem Wahrheitswert passend verknüpfen.
Schon mal das Wort Rekursion gehört oder den Begriff Funktion?
Alternativ Subroutine?
Packe deinen Algorythmus in eine Funktion / Subroutine
zum beispiel
include stbool.h
void main()
.
.
.
for (i=1,i<imax;i++),
{
print fensterdiskriminator (Xdat[i];Zmax[i];Ymin[i]);
}
.
.
.
loop;
bool fensterdiskriminator (dat, max,min)
{
if(dat <= max || min<= dat)
return false;
else return true;
endif;
};
Mike schrieb:> genau das wollte ich vermeiden da ich mehrere werte zu überprüfen habe> und die if somit kilometerlang wird :-/
Spielt doch keine Rolle. Mit entsprechender Formatierung ist das
trotzdem lesbar:
1
if(
2
(Wert>x)&&(Wert<y)&&
3
(AndererWert>x)&&(AndererWert<y)&&
4
(Nochwas>x)&&(Nochwas<y)&&
5
/* usw. */
6
){
7
/* tu was */
8
}
Wie die genaue Formatierung aussieht, ist Geschmackssache. Die
Überprüfung kann man alternativ auch in eine eigene Funktion packen,
damit der restliche Code besser zu lesen ist. Am besten in das gleiche
Sourcefile und als static definieren, dann wird das der Compiler
wahrscheinlich inlinen.
Sebastian schrieb:> #define schrieb:> Die Kür ist aber ein Makro.>> Mit dem Nachteil dass Seiteneffekte im Parameter, der mehrfach> auftaucht, auch mehrfach passieren.
??? Kann er das näher erläutern?
#define schrieb:> Sebastian schrieb:>> #define schrieb:>> Die Kür ist aber ein Makro.>>>> Mit dem Nachteil dass Seiteneffekte im Parameter, der mehrfach>> auftaucht, auch mehrfach passieren.
Und mit dem Vorteil, dass es nicht typgebunden ist - also die Funktion
eines templates in c++ erfüllen kann.
> ??? Kann er das näher erläutern?
Wenn man Makros z.B. mit Zuweisungen aufruft. MAKRO(i++) könnte i
mehrfach erhöhen, da es nur eine Textersetzung ist.
#define schrieb:> Sebastian schrieb:>> #define schrieb:>> Die Kür ist aber ein Makro.>>>> Mit dem Nachteil dass Seiteneffekte im Parameter, der mehrfach>> auftaucht, auch mehrfach passieren.>> ??? Kann er das näher erläutern?
Wenn "wert" z.B. der Rückgabewert von einem Funktionsaufruf ist, wird
bei
1
if ((wert() > x) && (wert() < y))
die Funktion mehrfach aufgerufen. In einen Makro verpackt, sieht man das
dann an der aufrufenden Stelle im Programmcode nicht mehr
offensichtlich. Wenn in der Funktion wert() dann noch andere Dinge
passieren, werden diese doppelt angestoßen.
Mike schrieb:> genau das wollte ich vermeiden da ich mehrere werte zu überprüfen habe> und die if somit kilometerlang wird :-/
Hast du mehrere vollkonmmen unabhängige Werte zu vergleichen (1), oder
soll nur ein fester Wert irgendwo eingeordnet werden (2)?
So also (1):
1
if(10<temperatur&&temperatur<20
2
&&100<druck&&druck<200
3
&&40<wasser&&wasser<60
4
&&78<oel&&oel<87
5
)...
Oder so (2):
1
if(10<=temperatur&&temperatur<20)...
2
elseif(21<=temperatur&&temperatur<30)...
3
elseif(31<=temperatur&&temperatur<40)...
Denn im ersten Fall gibt es kaum Abhilfe, den zweiten Fall könnte man
aber evtl. durch eine Formel abbilden:
1
tempbereich=temperatur/10;
2
if(tempbereich==1)...
3
elseif(tempbereich==2)...
4
elseif(tempbereich==3)...
Oder stufenweise abfragen:
1
if(10<=temperatur&&temperatur<20)...
2
elseif(temperatur<30)...// ist hier sowieso mindestens 21
3
elseif(temperatur<40)...// ist hier sowieso mindestens 31
Na da bin ich froh, dass Leute wie Lothar das auch so machen.
Da ich ja noch nicht viel programmiert habe, immer noch lerne, mache ich
das auch so.
Vielen Dank, das gibt mir wieder etwas Sicherheit.
Für mich ist erstmal wichtig, dass der µC am Ende das tut was ich will.
Das Programm kann ja eh keiner sehen. ;-)
Man könnte auch in C++ den < Operator überladen, dass er einen int statt
eines bool zurückgibt.
Damit kann man doch bestimmt weiter spielen, so dass der erste Versuch
if (x < wert < y)
auch funktioniert.
PittyJ schrieb:> Man könnte auch in C++ den < Operator überladen, dass er einen int statt> eines bool zurückgibt.
Nein, das geht nicht, da für das überladen eines globalen operators
mindestens ein benutzerdefinierter type angegeben werden muss, und somit
ein operator<(int a,int b){return b-a;} unzulässig ist. Ausserdem
evaluiert jeder wert ungleich 0, also auch negative werte zu true. Es
währe also ein benutzerdefinierter type mit überladenem < operator,
einem einem constructor(const int&) und einem globalen
operator=(bool&,const type&) nötig.
Makro schrieb:> Wenn "wert" z.B. der Rückgabewert von einem Funktionsaufruf ist, wird> beiif ((wert() > x) && (wert() < y))> die Funktion mehrfach aufgerufen. In einen Makro verpackt, sieht man das> dann an der aufrufenden Stelle im Programmcode nicht mehr> offensichtlich. Wenn in der Funktion wert() dann noch andere Dinge> passieren, werden diese doppelt angestoßen.
Nicht unbedingt.
Wenn beim ersten Aufruf das Ergebnis <= x ist, ist das Ergebnis der
Bedingung schon bekannt² (unwahr) und somit wird auf den Vergleich mit y
verzichtet.
² beim && müssen beide Operanden wahr sein
Peter Dannegger schrieb:> Der GCC kann beim Switch Bereiche testen: switch( val ){> case 1 ... 15: blub(); break;> case 30 ... 300: blab(); break;> case 20 ... 27: blib(); break;> }
Das ist kein Standard C.
Hallo Peter,
du hast hier ja schon so einiges beigetragen und deine Kompetenz ist, so
denke ich, unbestritten. Danke für dieses Beispiel. Das werde ich wohl
auch mal probieren.