Prüfen ob Wert zwischen zwei Werten liegt

Gast #3729388
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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.
(Firma: Nisch-Aufzüge) Persönliche Seite #3729411
Lesenswert?

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;
};
#3729508
Lesenswert?

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.
Gast #3729691
Lesenswert?

#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.
#3729703
Lesenswert?

#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):
1
[Warning] comparison between signed and unsigned integer expressions [-Wsign-compare]
Gast #3729858
Lesenswert?

#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.
Moderator (Firma: Titel) Persönliche Seite #3729869
Lesenswert?

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
   else if ( 21 <= temperatur  && temperatur < 30 ) ...
3
   else if ( 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
   else if ( tempbereich == 2 ) ...
4
   else if ( tempbereich == 3 ) ...
Oder stufenweise abfragen:
1
   if      ( 10 <= temperatur  && temperatur < 20 ) ...
2
   else if ( temperatur < 30 ) ... // ist hier sowieso mindestens 21
3
   else if ( temperatur < 40 ) ... // ist hier sowieso mindestens 31
#3729876
Lesenswert?

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
Lesenswert?

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.
#3729894
Lesenswert?

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.
#3729933
Lesenswert?

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
#3730077
Lesenswert?

Peter Dannegger schrieb:
> Der GCC kann beim Switch Bereiche testen:
>
1
>   switch( val ){
2
>     case 1 ... 15: blub(); break;
3
>     case 30 ... 300: blab(); break;
4
>     case 20 ... 27: blib(); break;
5
>   }
6
>

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 schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren