Dreiecksvertauschen - Typumwandlung
-
Aufgabenstellung:
Schreiben Sie ein Programm, das den Wert zweier Variablen durch Zeigeroperationen vertauscht. Deklarieren Sie hierzu zwei Integer Variablen und zwei Zeiger auf diese Integervariablen. Geben Sie den Inhalt der von den Zeigern adressierten Speicherstellen aus. Vertauschen Sie dann den Inhalt der beiden Zeiger (d.h. die Adressen, die in den Zeigern gespeichert sind). Geben Sie nun nochmals den Inhalt der von den Zeigern adressierten Speicherstellen aus.
Meine Lösung:
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(); }
Meine Frage ist nun: Kann ich das so machen? Weil in de Musterlösnug stehen anstatt der int-Variablen char-Variablen und anschließend wird bei der Ausgabe dann eine Typumwandlung vorgenommen.
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);Gruß juniorcrew
-
Wer hat Eure Musterlösungen angefertigt? Hiwis im Opiumrausch? Chars als Integervariablen? Typumwandlung von char* nach char* um den Inhalt der adressierten Speicherstelle auszugeben? Ja nee is klar.
Meine würde so aussehen wie Deine, bis auf die Ausgabe, die gibt nicht die Inhalte der adressierten Speicherstellen, sondern die Inhalte der Zeiger aus. Also:
Geben Sie den Inhalt der von den Zeigern adressierten Speicherstellen aus / Geben Sie nun nochmals den Inhalt der von den Zeigern adressierten Speicherstellen aus
printf("%d, %d\n", *z1, *z2);
-
nein ich denke nicht, es ist die rede von 2 ints und 2 zeigern, also brauchst einen xor-swap da es sonst nicht möglich ist, bei diesem ist zu beachten dass die adressen nicht gleich sein dürfen, was sie in dem fall eh nie sein können, aber zur sicherheit sollte man vorher auf gleichheit prüfen, das sieht dann so aus
int main(void){ int x = 0xa; int y = 0xb; int *px = &x; int *py = &y; printf("px:%d",*px); printf("py:%d",*py); if(px!=py){ px^=py; py^=px; px^=py; } printf("px:%d",*px); printf("py:%d",*py); return 0; }
bin mir jetzt nicht sicher ob das so klappt? test es doch mal
lg lolo
-
juniorcrew schrieb:
Meine Frage ist nun: Kann ich das so machen? Weil in de Musterlösnug stehen anstatt der int-Variablen char-Variablen und anschließend wird bei der Ausgabe dann eine Typumwandlung vorgenommen.
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);Gruß juniorcrew
du kannst hier auch einfach fragen ob dir jemand helfen kann, du brauchst hier nicht irgendwelche falschen, höchst wahrscheinlich von dir erstellten müsterlösungen präsentieren, die kein lehrer bei verstand so austeilen würde...
lg lolo
-
noobLolo schrieb:
du brauchst hier nicht irgendwelche falschen, höchst wahrscheinlich von dir erstellten müsterlösungen präsentieren, die kein lehrer bei verstand so austeilen würde...
Grundsätzlich richtig, aber warum sollte er das tun, wenn er in diesem Fall gleichzeitig eine fast richtige Lösung präsentiert?
-
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
-
-
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