Variablentausch mit Hilfe von Makro
-
Was haltet ihr denn davon?
#define SWAP(a, b) a=a+b; b=a-b; a=a-b;
Sollte man vielleicht noch mit Klammern vollpumpen. Funktioniert mit double, int und float. Man kann ein Problem kriegen wenn a+b>max ist.
#define SWAP(a, b) a>b?(a=a-b, b=a+b, a=b-a):(a=b-a, b=b-a, a=a+b)
Irgendwie kann man immernoch einen Overflow haben wenn man a=2/3max, b=-2/3max, a-b=1.5max hat.
Mit a<0&&b<0?(a<b?(...):(...)):(a<0&&b>=0?(...):(a>=0&&b<0?(...):(...))) sollte man das aber hinkriegen dass es immer funktioniert ohne an max oder min anzustoßen und ohne bei a>=0&&b>=0 in den negativen Bereich zu kommen wegen unsigned, ist mir jetzt aber zu kompliziert. Und überhaupt, ich will/soll ja keine Komplettlösungen liefern, du sollst ja auch deinen Spaß haben
-
Bei int kann man auch XOR benutzen.
#define SWAP(a, b) a=a^b; b=b^a; a=a^b;
Bei float müsste man da bischen rummurksen, das ist dann nicht mehr schön
-
volkard schrieb:
gcc erlaubt zero sized arrays. das makro hat einen compiler erwartet, der das nicht machen tut.
Grr, immer diese Spezialfälle... :p
Aber gut, dass du darauf hingewiesen hast.
-
Richtig, bei float/double aber leider nicht.
-
Wo zeigt das Array denn hin, wenn es die Länge 0 hat? Auf NULL? Oder wahllos in den Speicher?
-
Genmutant schrieb:
Wo zeigt das Array denn hin, wenn es die Länge 0 hat? Auf NULL? Oder wahllos in den Speicher?
ein array zeigt nirgendwo hin. so'n gcc artiges 0-array belegt wohl einfach keinen speicher. was die sich dabei gedacht haben, weiss ich aber auch nicht. bestimmt kennt der gcc bald negative arrays als speichererweiterung *fg*, oder wo zumindest der index rückwärts läuft.
-
Wow, ich denke mir nur, schau ich mal eben in meinen Thread von heute Mittag und entdecke einen lebendige Diskussion um das Problem, das freut mich
Danke für die vielen vielen Antworten.
Werde mich morgen der Thematik annehmen, wünsche noch einen schönen AbendLg Christoph
-
;fricky schrieb:
was die sich dabei gedacht haben, weiss ich aber auch nicht.
-
volkard schrieb:
;fricky schrieb:
was die sich dabei gedacht haben, weiss ich aber auch nicht.
ok, am ende von structs ist es manchmal sinnvoll, das sehe ich ein. (obwohl in dem beispiel der rückgabewert von malloc gecastet wird, und das in einer compiler-doku *fg*) aber als normale variablen kann man ja auch 0-length arrays anlegen, oder? gibts dafür auch 'ne anwendung (ausser STATIC_ASSERTs zu vermiesen)?
-
;fricky schrieb:
ok, am ende von structs ist es manchmal sinnvoll, das sehe ich ein.
Ich auch.
;fricky schrieb:
als normale variablen kann man ja auch 0-length arrays anlegen, oder?
Ja. Mir scheint das ungefähr genauso sinnvoll, wie wenn
malloc(0)
was anderes alsNULL
zurückgibt.
gibts dafür auch 'ne anwendung?