Pointer Swap Anfängerfrage
-
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 TesterJetzt 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
undb
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.
-
supertux schrieb:
wieso? Und wenn ich diese Liste sortieren will? Sortieren ist sehr praxisbezogen.
Diese Liste kann ich ja gleich sortiert definieren. Sortieren wird man praktisch eher dynamisch erzeugte Strings (malloc), die von irgendwo eingelesen werden.
-
praktisch 0 schrieb:
Diese Liste kann ich ja gleich sortiert definieren. Sortieren wird man praktisch eher dynamisch erzeugte Strings (malloc), die von irgendwo eingelesen werden.
Jo, aber praktisch ist das Latte. Der Swapvorgang bleibt der selbe.
-
praktisch 0 schrieb:
Diese Liste kann ich ja gleich sortiert definieren. Sortieren wird man praktisch eher dynamisch erzeugte Strings (malloc), die von irgendwo eingelesen werden.
nicht unbedingt. Was ist wenn man die sortierte Liste später braucht, also später als die unsortierte? Sortieren ist nicht die einzige Listeoperation, die es gibt.
praktisch 0 schrieb:
Sortieren wird man praktisch eher dynamisch erzeugte Strings (malloc), die von irgendwo eingelesen werden.
sagt wer?