Dreieckstausch



  • Naja eine Funktion braucht man dazu wirklich nicht

    int a = 5;
    int b = 10;
    
    a = a+b;  // 15
    b = a-b;  // 5 "was wir haben wollten"
    a = a-b;  // 10 "was ir haben wollten"
    


  • Wie ich schon sagte, sowas funktioniert meist nur für primitive Typen. Und selbst dann nicht immer. Ein swap() hat in C++ aber grundlegende Anwendungsmöglichkeiten, deshalb wird man sowas auch häufig als Template Funktion implementiert sehen.
    Versuch doch mal ein swap() mit folgendem Code nach deinem Schema durchzuführen

    std::string a = "foo";
    std::string b = "bar";
    

    😉



  • Sehr lustig.

    In dem Beispiel war es int, nicht string o.ä.
    Ist in Büchern auch meistens so, dass man als Bsp int hat.

    versuch du mal folgendes, nach deinem Schema

    int a = 5;
    string s = "hallo welt";
    


  • bei den swap()-funktionen die man so findet geht es in erster linie ja auch nur ums verstehen. natürlich kannst du die funktion aus dem volkard-kurs nicht ohne weiteres nutzen um einen srting und einen integer zu tauschen. soll der arme volkard denn für jede möglichkeit eine extra-funktion hinschreiben? ich glaube mal nicht.
    wie erwähnt es geht immer nur ums verstehen...



  • Ach vergisst es einfach!

    Ich finde es bedauerlich, dass die Leute perdu immer nach irgendwelchen fehlern suchen.

    Der liebe Volkhard, hat keine swap fkt angegeben, von der ihr immer so sprecht! sondern einfach mit hilfe einer tmp variable den wert von a zwischengespeichert. Ich fänds halt gut, dass man auch ne version zeigt, in der man nicht extra eine variable braucht. Könnte man z.b. als eine Aufgabe stellen, damit die c++ Neulinge auch etwas nachdenken müssen.

    Deswegen war mein Post auch als @Volkhard deklariert.



  • @Volkhard schrieb:

    Naja eine Funktion braucht man dazu wirklich nicht

    int a = 5;
    int b = 10;
    a = a+b;  // 15
    b = a-b;  // 5 "was wir haben wollten"
    a = a-b;  // 10 "was ir haben wollten"
    

    ich weiss nicht ob der trick zu gebrauchen ist, wenn a+b grösser wird als in ein 'int' passt. aber mit 'unsigned int' sollte es ja wieder klappen...



  • Quatsch. Wsa machst du bei negativen Zahlen?



  • Michael E. schrieb:

    Quatsch. Wsa machst du bei negativen Zahlen?

    keine ahnung, aber mach mal a und b 'char' statt 'int' und initialisier mit 100 und 200.



  • @Volkhard schrieb:

    Ach vergisst es einfach!

    Ich finde es bedauerlich, dass die Leute perdu immer nach irgendwelchen fehlern suchen.

    wie ich schon sagte. Klar kann man immer Fälle finden in denen es nicht geht. Das war nicht der sinn. Der sinn war auch nicht den perfekten algorithmus zu finden 🙄

    Und wenn ihr weiter postet, werdet ihr immer wieder das gleiche Zitat wie hier bekommen.



  • Der heißt volkard und nicht Volkhard.

    net: Und dann? Was soll ich damit?



  • Michael E. schrieb:

    net: Und dann? Was soll ich damit?

    ausprobieren. geht nicht so, weil 300 nicht in ein 'char' passt
    edit: den tauscher mit XOR finde ich besser



  • Wwas zur Hölle willst du mir damit sagen?



  • Michael E. schrieb:

    Wwas zur Hölle willst du mir damit sagen?

    das hier:

    char a = 100;
        char b = 200;
        a = a+b; 
        b = a-b; 
        a = a-b;
        printf ("%d %d\n", a, b);
    

    funzt nicht richtig. sieht nur mit 'unsigned char' gut aus



  • Welch Überraschung. Aber was hat das mit negativen Zahlen zu tun?



  • Michael E. schrieb:

    Welch Überraschung. Aber was hat das mit negativen Zahlen zu tun?

    der überlauf vielleicht?



  • 🙄 🙄 🙄



  • net schrieb:

    geht nicht so, weil 300 nicht in ein 'char' passt

    aber 200 passt rein? 😉

    PS: ist das jetzt Zufall, dass du und Michael E. genau gleich viele Beiträge habt?



  • D@niel $chumann schrieb:

    PS: ist das jetzt Zufall, dass du und Michael E. genau gleich viele Beiträge habt?

    wir machen ein wettrennen 😉



  • @Volkhard schrieb:

    versuch du mal folgendes, nach deinem Schema

    Mein Schema? Wusste gar nicht, dass ich eins genannt hatte.

    @Volkhard schrieb:

    int a = 5;
    string s = "hallo welt";
    

    Das ist Quatsch, da du hier zwei Werte unterschiedlichen Typs hast. Wie soll denn nun eine Umwandlung durchgeführt werden? Bitweise? Lexikalisch?

    @Volkhard schrieb:

    Der liebe Volkhard, hat keine swap fkt angegeben, von der ihr immer so sprecht! sondern einfach mit hilfe einer tmp variable den wert von a zwischengespeichert.

    Und das ist für dich kein swap? Was soll denn daran falsch sein?
    Schon mal was von Code Reduktion gehört? Wie ich schon sagte, in C++ kann man sowas wunderbar als Template implementieren. Und dann ist deine Funktion unbrauchbar, die mit der tmp Variable kann jedoch relativ einfach angepasst werden.
    Und warum stört dich die tmp Variable? Wie ich schon sagte, funktioniert deine Funktion nur mit primitiven Typen (wozu ja int gehört) erwartungsgemäss. Und solche Werte können auf gängigen x86 Systemen auch problemlos in Registern gehalten werden. Du wirst deshalb mit deiner Version nicht zwangsläufig Speicher- bzw. Geschwindigkeitsvorteile haben.

    net schrieb:

    funzt nicht richtig. sieht nur mit 'unsigned char' gut aus

    Wieso? Funktioniert doch. Hast wahrscheinlich einfach mal die Warnungen deines Compilers ignoriert. Da nicht selten char als signed definiert wird und der Wertebereich von -128 bis 127 geht, passt 200 nunmal nicht rein und der Wert wird als -56 (200 - 256) genommen. Das dürftest du dann auch als Ausgabe haben.

    D@niel $chumann schrieb:

    aber 200 passt rein? 😉

    Wenn char unsigned ist, dann schon. 🙂


Anmelden zum Antworten