Forum: Mikrocontroller und Digitale Elektronik If- Abfrage groeßer kleiner


von Hannes (Gast)


Lesenswert?

Hallo,

gibts eine Möglichkeit, dass unten kürzer zu schreiben?

if ((x1-x2) > 30 && (x1-x2) < 100)

kann ich da das && irgendwie vermeiden und dieses kürzer schreiben,
gibts da irgendeinen Trick?

lg und vielen Dank für die Antworten

von Falk B. (falk)


Lesenswert?

@ Hannes (Gast)

>gibts eine Möglichkeit, dass unten kürzer zu schreiben?
>if ((x1-x2) > 30 && (x1-x2) < 100)

Wozu? Wiviel Million mal pro Sekunde soll das geprüft werden? 
Wahrscheinlich ist der Comiler schlau genug (x1-x2) nur einmal 
auszurechnen und das Egebnis zwischen zuspeichern. Wenn nicht, dann eben 
so
1
int tmp;
2
tmp = x1-x2
3
if tmp>30 && tmp<100)
MfG
Falk

von Hannes (Gast)


Lesenswert?

weniger Schreibarbeit, besseres Programm,

bei deiner Möglichkeit habe ich ja wieder ein && drinnen

von ARM-Fan (Gast)


Lesenswert?

Spontan würde ich nein sagen.
Aber anschaulicher kann man es programmieren, damit
man auch in 2 Wochen noch auf den ersten Blick sieht,
was man da eigentlich gemeint hat.

z.B. so:
1
void BehandleWerteX1undX2(int x1, int x2)
2
{
3
  int differenz = x1 - x2;
4
5
  if (differenz < 30) return;
6
  if (differenz > 100) return;
7
8
  MachWasMitDenWerten(x1, x2);
9
}

Ich versuche solche tief verschachtelten Konstrukte wie:
1
if (a==0)
2
{
3
  if (b==3 && c==5)
4
  {
5
     if (d != a)
6
     {
7
        MachEndlichWas();
8
     }
9
  }
10
}

durch sowas wie oben zu vermeiden.

von Falk B. (falk)


Lesenswert?

@ Hannes (Gast)

>weniger Schreibarbeit, besseres Programm,

Unsinn!

MFG
Falk

von Obelix (Gast)


Lesenswert?

Es soll manche (nicht alle) Compiler geben die folgendes können:
1
if (30 < x < 100)

von schlonz (Gast)


Lesenswert?

wenn man Folgendes hat:

int x;
...

if ( (x<0) && (x>x_max) )
 {...}

kann man das auch so machen:

if ( (unsigned int)x > x_max )
  {...}

bei zwei Schranken, muß man halt vorher den Wert x entsprechend 
anpassen, sodaß es mit dieser Methode auch funzt.

von Eddy C. (chrisi)


Lesenswert?

Also quasi:

if ((unsigned)(x1-x2-30) < 70)
    TuEs();

Krass. Herrlich selbsterklärend aber cool. Bin unsicher, ob da noch 
irgendwo +1 oder -1 fehlt.

von Hannes (Gast)


Lesenswert?

Geht nicht auch, dass ich ein #define definiere, also "#define name 
text" und im Text dan nur den namen aufrufe und zurückbekomme, ob x in 
den Grenzen liegt?

lg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Es soll manche (nicht alle) Compiler geben die folgendes können:
>
> if (30 < x < 100)

Das kann jeder C-Compiler. Allerdings ist das Resultat nicht das 
erwartete.

von Karl H. (kbuchegg)


Lesenswert?

Hannes wrote:
> Geht nicht auch, dass ich ein #define definiere, also "#define name
> text" und im Text dan nur den namen aufrufe und zurückbekomme, ob x in
> den Grenzen liegt?
>
1
#define IN_RANGE(x,min,max)  ((x) < (min) ? 0 : (x) > (max) ? 0 : 1)
2
3
4
void foo()
5
{
6
   if( IN_RANGE( a, 70, 100 ) )
7
     ....

Aber ob das klarer ist, ich weiss nicht :-)

Natürlich hätte man den ?: auch vermeiden können ...
1
#define IN_RANGE(x,min,max)  ((min) > (x) && (x) < (max))
... aber du wolltest ja kein &&

Wie immer gilt bei Makros: Vorsicht mit der Auswertung. Ein
1
   if( IN_RANGE( a++, 70, 100 ) )

geht kräftig in die Hose. Vermeidbar sind die Probleme mit einer
Funktion:
1
unsigned char InRange( unsigned char Value,
2
                       unsigned char Min, unsigned char Max )
3
{
4
  if( Value < Min )
5
    return FALSE;
6
7
  if( Value > Max )
8
    return FALSE;
9
10
  return TRUE;
11
}

Ein C Profi würde das aber so schreiben:
1
unsigned char InRange( unsigned char Value,
2
                       unsigned char Min, unsigned char Max )
3
{
4
  return (Value > Min) && ( Value < Max );
5
}

von Unbekannter (Gast)


Lesenswert?

Diese ganzen InRange()-Ansätze haben das Problem, dass nicht klar ist, 
ob die Schranken nun zum Wertebereich dazugehören oder nicht.

Darum ist der eindeutigste Ansatz wohl:
1
void blafasel(int x1, int x2)
2
{
3
  int differenz = x1 - x2;
4
5
  if ( differenz > 30  &&  differenz < 100 )
6
  {
7
    // Mach was
8
  }
9
}
Grundsätzlich ist es eine gute Idee, Prädikaten einen eigenen Namen zu 
geben. Der Name sollte aber IMHO Anwendungsfall bezogen sein. Also z.B.:
1
const int abweichung_minimal = 30;
2
const int abweichung_maximal = 100;
3
4
uint8_t ist_regelabweichung_klein(int soll, int ist)
5
{
6
  int differenz = soll - ist;
7
8
  return differenz >= abweichung_minimal && differenz <= abweichung_maximal;
9
}
10
11
void berechne(int soll, int ist)
12
{
13
  if ( ist_regelabweichung_klein(soll, ist) )
14
    return;
15
16
  // Mache den Rest...
17
}
Zusätzlich können diese kleinen Prädikatfunktionen noch "static inline" 
deklariert werden.

von Rolf Magnus (Gast)


Lesenswert?

> Diese ganzen InRange()-Ansätze haben das Problem, dass nicht klar ist,
> ob die Schranken nun zum Wertebereich dazugehören oder nicht.
>
> Darum ist der eindeutigste Ansatz wohl:
> void blafasel(int x1, int x2)

Naja...

von Stefan (Gast)


Lesenswert?

Und jetzt das ganze für mich nochmal in ASM .   ;-))
Danke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.