Forum: Mikrocontroller und Digitale Elektronik variable zwischen zwei werten setzen


von Mike (Gast)


Lesenswert?

Hallo,
gibt es irgend einen Befehl, mit dem ich eine Variable zwischen zwei 
werten setzen kann?
10<=x<=20
also x gebe ich als input. Wenn dieser kleiner gleich 10 ist, soll x=10 
sein. Ist x>20, soll x=20 sein. Ist x=12, soll x=12 bleiben.
bisher habe ihc es so
1
if(x<=10) x = 10;
2
else if(x>=20) x = 20;

nur eine reihe könne ich einen Wert auch mit dem Fragezeichen überprüfen
1
x = ((x>=20) ? 20 : x);
gibt es so etwas auch mit mehreren bedingunen? also, dass es eine zeile 
bleibt?

Mike

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

1
x = x<10?10:x>20?20:x *
aber wozu? Damit niemand mehr rafft was da passiert?

* zumindest glaube ich dass das funktioniert

von Tcf K. (tcfkao)


Lesenswert?

x = ((x>20) ? 20 : (x<10) ? 10 : x);

Müsste funktionieren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ich würde es so machen:  x = min(max(10,x),20);
Dann muss ich nicht selber mit dem Fragezeichenoperator 
herumhantieren...

von Dennis (Gast)


Lesenswert?

Mike schrieb:
> also, dass es eine zeile bleibt?

Oh mann, wer hat wieder die Informatiker aus dem Keller gelassen???

Oder andersrum, weniger subtil: was für eine blödsinnige Forderung...

von Tcf K. (tcfkao)


Lesenswert?

Vielleicht hat er vorher in BASIC programmiert und hat eine Phobie gegen 
Zeilenumbrüche...

von Peter II (Gast)


Lesenswert?

Einzeilig kann man auch so schreiben
1
if(x<=10) x = 10; else if(x>=20) x = 20;

von Der Andere (Gast)


Lesenswert?

Mike schrieb:
> also, dass es eine zeile bleibt?

Die Zeiten in dem das Basicprogramm nicht zu groß werden durfte um noch 
in den 2,4, 8 oder 16kByte Hauptspeicher zu passen sind vorbei.
Du musst nicht mehr an Whitespaces sparen.

von Carl D. (jcw2)


Lesenswert?

Da nicht genau spezifiziert ist, welche C Geschmacksrichtung gemeint 
ist:
1
inline template<typename T> T clip(T _min, T x, T _max) {
2
  return min(max(_max,x),_max);
3
}
4
...
5
  int x = zufall();
6
7
  x = clip( 10, x, 20 );
8
...
Typesicher, schnell und ohne Doku verständlich. Über die 
Parameterreihenfolge kann man streiten, hier wurde auf "schön lesbarer 
Aufruf" optimiert. Schreibt einer, der seinen Basteltisch im 
1.Obergeschoß stehen hat.

von Dennis (Gast)


Lesenswert?

#define W(x)  if(x<=10){x=10;}else if{(x>=20)x=20;}  //Window function

Theoretisch sollte das hier auch gehen. Mit nur 4 Zeichen! (So 
blödsinnig das auch ist..)

von Salewski, Stefan (Gast)


Lesenswert?

Das ist durchaus sinnvoll und auch fertig erhältlich, etwa

https://developer.gnome.org/glib/stable/glib-Standard-Macros.html#CLAMP:CAPS

von Walter T. (nicolas)


Lesenswert?

Hmmm....ich sehe den Sinn eigentlich eher in Operationen:
1
 int a, b;
2
 
3
 ...
4
5
 b = clamp((long) b + a,INT_MIN, INT_MAX);

Würde man das so schreiben oder gibt es da auch schon etwas anderes 
fertiges?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Walter T. schrieb:
> Hmmm....ich sehe den Sinn eigentlich eher in Operationen:
>
1
>  int a, b;
2
> 
3
>  ...
4
> 
5
>  b = clamp((long) b + a,INT_MIN, INT_MAX);
6
>
>
> Gibt es da auch schon etwas fertiges?

In Standard-C nicht.
Aber jeder Programmierer hat normalerweise sowieso ein 
Common-Verzeichnis, in dem er für ihn zugeschnitten Standard 
Funktionalitäten vorrätig hat.
Nur sehen halt meine Standard-Funktionalitäten anders als als deine. 
Irgendwo muss man dann auch im Standard-C sagen: bis hier her und nicht 
weiter. Alles darüber hinausgehende muss jeder Programmierer entweder 
selbst machen oder sich von irgendwo downloaden.
Früher war es halt zu 80% selber machen und zu 20% von anderen klauen. 
Heute hat sich das, nicht unbedingt zum Vorteil des Nachwuchses, 
umgedreht.

und ja: klar würde man das so schreiben.
Gerade mathematische Dinge bieten sich an, dass sie nach dem Muster 
funktionieren: Argumente sind Eingangswerte, der Returnwert ist für das 
Ergebnis reserviert.
In vielen anderen Fällen ist das nicht besonders sinnvoll, weil man oft 
auch noch einen Fehlercode im API unterbringen muss, aber für 
mathematische Funktionalitäten geht das oft und bringt den Vorteil, die 
Verwendung in Expressions zu ermöglichen.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

OK, laß mich die Frage anders stellen: Ich habe das "clamp"-Makro jetzt 
in meiner Header Sammlung und nutze es so:
1
 int8 a, b;
2
 
3
 ...
4
5
 b = clamp((long) b + a,INT8_MIN, INT8_MAX);

Ist das effizient? Schafft der Compiler das, zu erkennen, daß die Summe 
zweier INT8 niemals größer als INT16 wird und optimiert entsprechend, 
oder ist es sinnvoller, eine Funktion für diesen Datentyp zu schreiben, 
die das explizit berücksichtigt?

von Karl H. (kbuchegg)


Lesenswert?

Walter T. schrieb:
> OK, laß mich die Frage anders stellen: Ich habe das "clamp"-Makro jetzt
> in meiner Header Sammlung und nutze es so:
>
1
>  int8 a, b;
2
> 
3
>  ...
4
> 
5
>  b = clamp((long) b + a,INT8_MIN, INT8_MAX);
6
>
>
> Ist das effizient? Schafft der Compiler das, zu erkennen, daß die Summe
> zweier INT8

du hast hier keine INT8 mehr.
Du addierst einen long mit einem long. Und das Ergebnis hat wieder den 
Datentyp long.

Wenn du castest, dann gilt das auch.

von Walter T. (nicolas)


Lesenswert?

Karl H. schrieb:
> du hast hier keine INT8 mehr.
> Du addierst einen long mit einem long. Und das Ergebnis hat wieder den
> Datentyp long.

Das soll also vermutlich heißen: Der Compiler hat keine Chance 
festzustellen, daß der Wert, der sich aus der Summe der long int ergibt, 
vom Wertebereich immer in 16 Bit paßt und kann auch deswegen nicht 
entsprechend optimieren.

Danke für die Erklärung. Und jetzt gebe ich den gekaperten Thread auch 
wieder zurück. Wo ist der TO?

von Karl H. (kbuchegg)


Lesenswert?

Walter T. schrieb:

> festzustellen, daß der Wert, der sich aus der Summe der long int ergibt,
> vom Wertebereich immer in 16 Bit paßt und kann auch deswegen nicht
> entsprechend optimieren.

Mach dir die Sichtweise zu eigen:
Mit einem Cast überstimmst du den Compiler in allen Belangen. In wie 
weit ein Cast auch in die Optimierung mit hineingreift (gemeint ist: 
abschaltet), weiss nur der Compilerhersteller - in dem Fall greift man 
dann eher zur pessimistischen Sichtweise.

Ein Cast ist die C Form von "Gusch, hiazt red i"
(deutsche Übersetzung: Würdest du die Freundlichkeit haben, den Mund zu 
halten und einfach zur Kentniss nehmen, was ich gerade gesagt habe wie 
ich es haben will?"

von Paul B. (paul_baumann)


Lesenswert?

Walter T. schrieb:
> Und jetzt gebe ich den gekaperten Thread auch
> wieder zurück. Wo ist der TO?

Irgendwo zwischen 10 und 20.

MfG Paul

von Dennis (Gast)


Lesenswert?

Dennis schrieb:
> Oh mann, wer hat wieder die Informatiker aus dem Keller gelassen???

Walter T. schrieb:
> Und jetzt gebe ich den gekaperten Thread auch
> wieder zurück. Wo ist der TO?

Zurück in den Keller?

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.