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
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...
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.
Da nicht genau spezifiziert ist, welche C Geschmacksrichtung gemeint
ist:
1
inlinetemplate<typenameT>Tclip(T_min,Tx,T_max){
2
returnmin(max(_max,x),_max);
3
}
4
...
5
intx=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.
#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..)
Walter T. schrieb:> Hmmm....ich sehe den Sinn eigentlich eher in Operationen:>
1
>inta,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.
OK, laß mich die Frage anders stellen: Ich habe das "clamp"-Makro jetzt
in meiner Header Sammlung und nutze es so:
1
int8a,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?
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
>int8a,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.
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?
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?"
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?