Gast
#3729369
Gibt es in Ceine einfache Möglichkeit zu überprüfen ob ein Wert zwischen zwei Werte liegt? Ich dachte da an
1 | |
Aber so funzt das leider nicht. Danke euch schonmal
|
Anzeige
|
Prüfen ob Wert zwischen zwei Werten liegt
Gast
#3729369
Gibt es in Ceine einfache Möglichkeit zu überprüfen ob ein Wert zwischen zwei Werte liegt? Ich dachte da an
Aber so funzt das leider nicht. Danke euch schonmal if ((wert > x) & (wert < y))
Gast
#3729377
Oliver R. schrieb: > if ((wert > x) & (wert < y)) oder (wenn man logisch rangeht) if ((wert > x) && (wert < y))
Gast
#3729384
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.
Gast
#3729388
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.
Gast
#3729406
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.
Gast
#3729407
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:
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.
Gast
#3729620
Auf die Idee mit der Funktion könnte ich auch selber kommen.... :-D Ok, danke euch.
Gast
#3729628
Die Kür ist aber ein Makro. Weil schneller, weil es den Sinn besser wieder gibt, weil es gut lesbar ist.
Gast
#3729677
#define schrieb: > Die Kür ist aber ein Makro. Mit dem Nachteil dass Seiteneffekte im Parameter, der mehrfach auftaucht, auch mehrfach passieren.
Gast
#3729683
cc schrieb: > if ((wert > x) && (wert < y)) Umsortiert sieht es dem Original etwas ähnlicher:
Gast
#3729684
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?
Gast
#3729691
#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: > Die Kür ist aber ein Makro. Weil schneller, weil es den Sinn besser > wieder gibt, weil es gut lesbar ist. Das wurde hier schon einige Male diskutiert: Beitrag ""C" Makro vs. Funktion" Beitrag "Unterschied #define und Funktion?" http://www.mikrocontroller.net/articles/Makro #define schrieb: > ??? Kann er das näher erläutern? http://www.mikrocontroller.net/articles/C-Pr%C3%A4prozessor#m.C3.B6gliche_Probleme_beim_Einsatz_des_Pr.C3.A4prozessors avr schrieb: > Und mit dem Vorteil, dass es nicht typgebunden ist - also die Funktion > eines templates in c++ erfüllen kann. Was früher oder später durch Unachtsamkeit zu folgender Warnung führen wird (jedoch nur, wenn man sie auch einschaltet):
Gast
#3729858
#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
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):
Oder so (2):
Denn im ersten Fall gibt es kaum Abhilfe, den zweiten Fall könnte man aber evtl. durch eine Formel abbilden:
Oder stufenweise abfragen:
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. ;-)
Gast
#3729881
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. Der GCC kann beim Switch Bereiche testen:
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
Gast
#3729934
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. #define schrieb: > Das ist kein Standard C. Niemand zwingt Dich, es zu benutzen. Peter Dannegger schrieb: > Der GCC kann beim Switch Bereiche testen: >
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.
Beitrag #7691781 wurde von einem Moderator gelöscht.
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|