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 Abend 🙂

    Lg Christoph



  • ;fricky schrieb:

    was die sich dabei gedacht haben, weiss ich aber auch nicht.

    http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html



  • volkard schrieb:

    ;fricky schrieb:

    was die sich dabei gedacht haben, weiss ich aber auch nicht.

    http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

    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 als NULL zurückgibt.
    gibts dafür auch 'ne anwendung?


Anmelden zum Antworten