Pointer Swap Anfängerfrage



  • Bashar schrieb:

    Auch mit Strings, die länger als 4 Zeichen sind?

    Ja auch mit

    char a [] = "a0123456789012345678901234567890123456789";
    char b [] = "b0123456789012345678901234567890123456789";
    swap ( &a, &b );

    funzt without problems.

    Bashar schrieb:

    Weak Typing FTW! 😉

    Wie meinen ?

    + The Tester +



  • The Tester schrieb:

    Ja auch mit

    char a [] = "a0123456789012345678901234567890123456789";
    char b [] = "b0123456789012345678901234567890123456789";
    swap ( &a, &b );

    funzt without problems.

    das halte ich für'n gerücht. zeig doch mal den ganzen code und vor allem auch die 'swap' funktion.
    🙂



  • ~fricky schrieb:

    das halte ich für'n gerücht. zeig doch mal den ganzen code und vor allem auch die 'swap' funktion.
    🙂

    #include <stdio.h>
    
    void swap (char **a, char **b)
    {
        char *c = *a;
        *a=*b;
        *b=c;
    } 
    
    int main ( void )
    {
    	char a [] =  "a0123456789012345678901234567890123456789"; 
    	char b [] =  "b0123456789012345678901234567890123456789"; 
    	swap ( &a, &b );
    
    	printf ( "%s %s\n", a, b );
    	return 0;
    }
    

    linux@Tester:~/gcc$ ./main
    b0123456789012345678901234567890123456789 a0123456789012345678901234567890123456789



  • Also mit MS-Compiler geht das nur mit explizitem cast:

    swapit((char**)&a,(char**)&b);
    

    Und das klappt dann solange, bis du mal einen String in der Länge änderst... "without problems" würde ich das nicht nennen...



  • The Tester schrieb:

    linux@Tester:~/gcc$ ./main
    b0123456789012345678901234567890123456789 a0123456789012345678901234567890123456789

    ^^hehe, da hast du dich schön selber reingelegt. mach den test nochmal mit zwei strings, die komplett unterschiedlich sind, also nicht nur die ersten sizeof(char*) zeichen.
    🙂



  • Jetzt wird gar nix mehr geswappt: 😮

    char a [] =  "The Tester is testing stuff.";
        char b [] =  "The stuff is being tested by The Tester";
    
        printf ( "%s %s\n", a, b );
        swap ( &a, &b );
        printf ( "%s %s\n", a, b );
    

    Ausgabe:

    The Tester is testing stuff. The stuff is being tested by The Tester
    The Tester is testing stuff. The stuff is being tested by The Tester

    Jetzt hat der keine Lust mehr zu swappen. 😕



  • the tester schrieb:

    supertux schrieb:

    allerdings wird bei

    char a[]={"Eins"};
    char b[]={"Zwei"};
    swap(&a,&b);
    

    alles in die Hose gehen, weil a und b keine Zeiger sind. Das ist jezt die Frage, willst du nur die Referenzen umstauschen oder den Inhalt im Speicher umtauschen?

    Da geht nichts in die Hose. Es wird zwar eine Warnung vom Compiler ausgegeben, aber das compiliert und läuft. Bei mir jedenfalls.

    - The Tester -

    natürlich geht in die Hose, bei dir nicht, nur zufällig, weil beide Puffer gleich groß sind:

    #include <stdlib.h>
    
    void swap (char **a, char **b) {
        char *c = *a;
        *a=*b;
        *b=c;
    }
    
    int main()
    {
        char a[]={"AHA"}; 
        char b[]={"IIIIII"};
        printf("sizeof(a) = %d, sizeof(b) = %d\n", sizeof(a), sizeof(b));
        swap(&a,&b); 
        printf("sizeof(a) = %d, sizeof(b) = %d\n", sizeof(a), sizeof(b));
        printf("%s,%s\n",a,b); 
        return 0; 
    }
    

    Ausgabe:

    $ ./geht_in_die_hose
    sizeof(a) = 4, sizeof(b) = 7
    sizeof(a) = 4, sizeof(b) = 7
    IIII???????,AHA
    

    edit: an der Stelle von ?????? kam nur wirres Zeug, was phpbb nicht anzeigen kann.



  • Jetzt wollte ich es ganz clever machen:

    #include <stdio.h>
    
    void swap (char **a, char **b)
    {
        char *c = *a;
        *a=*b;
        *b=c;
    }
    
    int main ( void )
    {
        char a [] =  "The Tester is testing stuff.";
        char b [] =  "The stuff is being tested by The Tester";
        char* pa = a;
        char* pb = b;
        swap ( &pa, &pb );
        printf ( "%s %s\n", a, b );
        return 0;
    }
    

    Es kommt zwar keine Fehlermeldung mehr,
    wird aber auch nichts geswappt:

    The Tester is testing stuff. The stuff is being tested by The Tester

    😕



  • tester: vergiss es, Arrays sind keine Zeiger. Diese swap Methode funktioniert nur bei Zeigern.



  • The Tester schrieb:

    Jetzt hat der keine Lust mehr zu swappen.

    doch, er swappt schon noch, aber nur die ersten zeichen, was du aber nicht sehen kannst, weil diese in beiden strings gleich sind. der test ist genau so unbrauchbar wie dein erster. du wirst deinem namen einfach nicht gerecht.
    🙂



  • supertux schrieb:

    natürlich geht in die Hose, bei dir nicht, nur zufällig, weil beide Puffer gleich groß sind:

    Ja, ich sehe ein, da ist der Wurm drin.
    <These>
    Die Arrays char a [] und char b [] lassen sich also nicht so ohne weiteres swappen.
    </These>
    🙂



  • The Tester schrieb:

    supertux schrieb:

    natürlich geht in die Hose, bei dir nicht, nur zufällig, weil beide Puffer gleich groß sind:

    Ja, ich sehe ein, da ist der Wurm drin.
    <These>
    Die Arrays char a [] und char b [] lassen sich also nicht so ohne weiteres swappen.
    </These>
    🙂

    wie ich schon sagte, es hängt davon ab, ob du die Adresse umtauschen willst oder die Inhalte worauf sie zeigen. Das zweite ist natürlich möglich.



  • The Tester schrieb:

    Die Arrays char a [] und char b [] lassen sich also nicht so ohne weiteres swappen.

    wenn beide gleich lang sind, dann kannst du einfach die einzelnen zeichen tauschen. sind sie nicht gleich lang, dann musste natürlich irgendwie tricksen.
    🙂



  • Heißt das wenn ich zB: mit Array von Strings "Daten" einrichte in Form :
    ["ba","a","c"]
    und diese dan lexikographisch Ordnen will:
    ["a","ba","c"]
    Das ich nicht einfach den Pointer von Daten[0] mit dem von Daten[1] spawen kann sondern muss ein in neues passendes Array erzeugen und diese dann Füllen ?
    Gehts echt nicht geschickter ?

    MFG Deka



  • Deka schrieb:

    Heißt das wenn ich zB: mit Array von Strings "Daten" einrichte in Form :
    ["ba","a","c"]
    und diese dan lexikographisch Ordnen will:
    ["a","ba","c"]
    Das ich nicht einfach den Pointer von Daten[0] mit dem von Daten[1] spawen kann sondern muss ein in neues passendes Array erzeugen und diese dann Füllen ?
    Gehts echt nicht geschickter ?

    MFG Deka

    Doch, z.B. mit std::vector und std::sort...



  • Deka schrieb:

    Heißt das wenn ich zB: mit Array von Strings "Daten" einrichte in Form :[...]Das ich nicht einfach den Pointer von Daten[0] mit dem von Daten[1] spawen kann sondern muss ein in neues passendes Array erzeugen und diese dann Füllen ?

    Nein, das heißt es nicht.



  • Deka schrieb:

    Heißt das wenn ich zB: mit Array von Strings "Daten" einrichte in Form :
    ["ba","a","c"]
    und diese dan lexikographisch Ordnen will:
    ["a","ba","c"]
    Das ich nicht einfach den Pointer von Daten[0] mit dem von Daten[1] spawen kann sondern muss ein in neues passendes Array erzeugen und diese dann Füllen ?
    Gehts echt nicht geschickter ?

    MFG Deka

    liest denn keiner, was ich schreibe? Inhalt des Arrays mit dem Inhalt eines anderen Arrays zu swappen ist natürlich möglich. Worauf die arrays "zeigen" [1]
    kann man nicht ändern. Bitte lesen.

    [1] arrays sind keine Zeiger, aber man kann sie implizit als Zeiger benutzen



  • Deka schrieb:

    Heißt das wenn ich zB: mit Array von Strings "Daten" einrichte in Form :
    ["ba","a","c"]
    und diese dan lexikographisch Ordnen will:
    ["a","ba","c"]
    Das ich nicht einfach den Pointer von Daten[0] mit dem von Daten[1] spawen kann sondern muss ein in neues passendes Array erzeugen und diese dann Füllen ?
    Gehts echt nicht geschickter ?

    MFG Deka

    Wenn du das so schreibst:

    char *A[] = { "a","ba","c"};
    

    Dann hast es du wieder mit Zeigern zu tun, die kannst du swappen.



  • Wenn du das so schreibst:

    char *A[] = { "a","ba","c"};
    

    Wobei der Praxisbezug stark gegen 0 gehen dürfte.
    🙂



  • praktisch 0 schrieb:

    Wenn du das so schreibst:

    char *A[] = { "a","ba","c"};
    

    Wobei der Praxisbezug stark gegen 0 gehen dürfte.
    🙂

    wieso? Und wenn ich diese Liste sortieren will? Sortieren ist sehr praxisbezogen.


Anmelden zum Antworten