Dreiecksvertauschen - Typumwandlung



  • main ()
    {
     int a,b, *z1, *z2, *zw;
    
     z1 = &a;
     z2 = &b;
    
     printf("z1 = %d z2 = %d", *z1, *z2);
    
     zw = z1;
     z1 = z2;
     z2 = zw;
    
     printf("\n\nz1 = %d z2 = %d", *z1, *z2); 
    
     getch();     
     }
    

    OK, das habe ich "überlesen" mit dem Inhalt. Habe ich nun abgeändert, war ja blos ein sternchen 🙂

    Aber bei der Musterlösung mit der Typumwandlung, (char*) was hat dieses * darin zusuchen? Hat das wieder mit dem Inhalt zutuen oder nur mit der Typumwandlung?

    Gruß juniorcrew



  • LordJaxom schrieb:

    Grundsätzlich richtig, aber warum sollte er das tun, wenn er in diesem Fall gleichzeitig eine fast richtige Lösung präsentiert?

    das wüßt ich auch gern 😕

    aber richtig ist sie nicht, denn auch wenn nicht def. wird ein pointer normal mit

    int *p;
    printf("%p",p);
    

    geplottet und falls das aus irgendeinem grund nicht klappen sollte gibt man zeiger nicht als "%d" sondern als "%x" aus...

    darüber hinaus ist nicht von einem tausch über einen 3. zeiger die rede...

    also ist die lösung afik. nicht richtig und damit auch keine "muster-lösung" denn die stehen idr. für 100% getestete richtige aufgaben, erstellt von leuten die das schon ne ganze zeit lang machen da sie sonst nicht unterrichten dürften 😉

    lg lolo



  • noobLolo schrieb:

    "muster-lösung" denn die stehen idr. für 100% getestete richtige aufgaben

    nobodys perfect 🙄



  • Musterlösung:

    char a, b, *c, *d, *e; 
    c = &a; 
    d = &b; 
    printf(“%d %d“,(char *)c,(char *)d); 
    e = c; 
    c = d; 
    d = e; 
    printf(“%d %d“,(char *)c, (char *)d);
    

    Das ist die uns zur Verfügung gestellt Musterlösung. Das andere war meie Lösung der Aufgabe. Da habe ich nie behauptet das die richtig ist. Das war ja gerade meine Frage. Da meine Lösung nicht mit der Musterlösung übereinstimmte... Die Musterlösung ist von unserem Prof..

    Also wie ist es denn nun richtig?
    Musterlösung? Nur wozu ist darin die Typumwandlung da? Da wird doch nr mit char-Variablen gearbeitet.

    Na klar sollt ihr mir helfen 😛



  • das ist und bleibt falsch 😕

    char a, b, *c, *d;
    c = &a;
    d = &b;
    //entweder
    printf("%p %p\n",(void *)c,(void *)d);
    if(c!=d){
    c^=d;
    d^=c;
    c^=d;
    }
    //oder
    printf("0x%x 0x%x\n",(unsigned)c, (unsigned)d);
    

    so evtl.?

    lg lolo



  • @juniorcrew

    kannst du das

    printf("%d %d",(char *)c,(char *)d);
    

    ohne warnung compilieren 🙄



  • Oki, danke habe ich nucn auch verstanden!

    main () 
    { 
     int a,b, *z1, *z2, *zw; 
    
     z1 = &a; 
     z2 = &b; 
    
     printf("z1 = %d z2 = %d", *z1, *z2); 
    
     zw = z1; 
     z1 = z2; 
     z2 = zw; 
    
     printf("\n\nz1 = %d z2 = %d", *z1, *z2); 
    
     getch();     
     }
    

    Also könnte man das hier so stehen lassen? So ein Überprüfung wie du vorhin sagtest, brauchen wir darin nicht, weil wir dasn och garnicht hatten. UNd eine Typumwandlung macht hierbei ja auch keinen Sinn meineserachtens.

    Danke für Deine/Eure Hilfe!

    Gruß juniorcrew



  • Selbsverständlich!

    Compiler: Default compiler
    Executing gcc.exe...
    gcc.exe "D:\Untitled2.c" -o "D:\Untitled2.exe" -g3 -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -g3
    Execution terminated
    Compilation successful



  • ja bis auf den tausch über *zw 😉

    also gehen wir die aufgabe doch mal langsam durch...

    Aufgabenstellung schrieb:

    Deklarieren Sie hierzu zwei Integer Variablen und zwei Zeiger auf diese Integervariablen.

    int x=0xa;
    int y=0xb;
    int *px=&x;
    int *py=&y;
    

    Aufgabenstellung schrieb:

    Geben Sie den Inhalt der von den Zeigern adressierten Speicherstellen aus.

    printf("%d %d",*px,*py);
    

    Aufgabenstellung schrieb:

    Vertauschen Sie dann den Inhalt der beiden Zeiger (d.h. die Adressen, die in den Zeigern gespeichert sind).

    if(px!=py){
    px^=py;
    py^=px;
    px^=py;
    }
    

    Aufgabenstellung schrieb:

    Geben Sie nun nochmals den Inhalt der von den Zeigern adressierten Speicherstellen aus.

    printf("%d %d",*px,*py);
    

    lg lolo



  • Also wir haben das über diesen dritten Zwischen-Zeiger mal gelernt, also es wurde mal erwähnt.

    Deine Methode verstehe ich garnicht! Die Bedingung in der IF-Schleife ist noch logisch für mich, aber dieses px^=... Was bedeutet das?



  • evtl. war die aufgabe genau darauf abgezielt, heraus zu finden wie man 2 vars ohne eine 3. tauschen kann wenn sie einfach nicht verfügbar ist (aus welchen gründen auch immer, sei es nur, weil nicht in der aufgabenstellung vorgesehen)
    http://en.wikipedia.org/wiki/XOR_swap_algorithm



  • juniorcrew schrieb:

    IF-Schleife

    der klassiker 😃


Anmelden zum Antworten