Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » vertauschen von zwei zielen von pointern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.10.2005, 15:44 Uhr
dt2158



so anschließend an das gestrige problem www.fun-soft.de/showtopic.php?threadid=13035&time=1130241587,
habe ich hier ein neues ("langfristig" muss ich ein string-array nach länge sortieren)

ich möchte zwei die pointer auf zwei strings vertauschen...

hier meine main-funktio


C++:
int main()
{
    int i;
    char input[200];


    char textlist[10][20];
    //char *sortlist[10]


    printf("\nBitte geben sie 10 Namen oder whatever ein!\n");

    for(i=0;i<10;i++)
    {
        printf("%i: ", i+1);
        fgets(textlist[i],19,stdin);

        if(textlist[i][0]=='\n')
        {
            printf("Sie ham wohl was vergessen... :)\n");
            i--;
        }
    }

    swap(textlist[0],textlist[1]);



    for(i=0;i<10;i++)
    {
        printf("%s",textlist[i]);
    }
}



das funktioniert auch wunderbar bis auf die swap funktion welche die ziele der zeiger vertauschen soll

hier die swap funktion


C++:
int swap(char *string1, char *string2)
{
    char *temp = *string1;
    *string1 = *string2;
    *string2 = *temp;
    return 1;
}



wenn es zur swap kommt kommt seg. fault...

die swapfunktion wurde uns praktisch fast so vom dozenten vorgegeben

wie bekomm ich das hin???

daaaaaanke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.10.2005, 16:12 Uhr
Spacelord
Hoffnungsloser Fall


Du darfst die Zeiger bei der Zuweisung nicht dereferenzieren.

C++:
char* temp = string1;
etc....




MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.10.2005, 23:45 Uhr
~dt2158
Gast


hmh

was heißt das "etc" und was dereferenzieren???

hab jetzt mal nur die zeile geändert und dann auch ma alle drei,
aber klappt nich so richtig... also entweder seg fault, nich getauscht oder nur ein element getauscht das andere hatte den selben wert
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.10.2005, 01:25 Uhr
Pablo
Supertux
(Operator)


@dt2158: deine swap Funktion wird nicht funktioniert, weil sie genauso schief geht, wie diese hier:


C++:
int swap(int a, int b)
{
    int c = a;
    a = b;
    b = c;
    return 1;
}



erkennst du da den Fehler?

Man übergibt Zeiger, weil dadruch, dass man die Adresse kennt, auf den Speicher zugreift und den Wert eine Variable ändern kann. Aber Zeiger sind auch Variablen, stink normale Variablen, die nichts anders tun, als einen Integer zu speicher, der die Adresse einer anderen Variable ist. Wenn du die Adresse in eine Funktion ändern willst, auf die ein Zeiger zeigt, musst du einen Zeiger auf den zeiger übergeben, also:


C++:
int swap(char **string1, char **string2)
{
    char *temp = *string1;
    *string1 = *string2;
    *string2 = temp;
    return 1;
}



was du gemacht hast, ist aber auch falsch, denn du änderst nicht ein String sondern lediglich den ersten Buchstabe, wobei "char *temp = *string1;" und "*string2 = *temp;" (bei dir) Kässe sind.

Ich rate dir, lies ein Tutorial oder ein Buch und informiere dich, wie man mit Zeigern arbeitet. Ansonsten wirst du das nicht richtig kappieren.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 27.10.2005 um 01:27 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.10.2005, 13:02 Uhr
~dt2158
Gast


Tja das prob is das programmiern 2 an der fachhochscule is und ich einfach kein bock zeit fürn buch hab, ich mach dat nich aus langweile oder weil ich "ma c lernen will" es muss klappen, und wenns geht auch noch verstehen und das so schnell wie möglich,

ich weiß drei dinge auf einma ...

das mit den zeigern hab ich grundsätlich schon verstanden, habe schon unter pascal zu schulzeiten mit zeigern listen gebastelt, aber hier is die syntax sch.. verwirrend

dein beispiel ändert aber auch nix immer noch die gleiche reihenfolge....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.10.2005, 13:32 Uhr
ao

(Operator)


Inhalte über Zeiger tauschen geht nur, wenn die Inhalte auch über Zeiger festgehalten werden. Ist in deinem Beispiel nicht der Fall, char textlist [10][20] ist ein zusammenhängender statischer Speicherbereich, und die Zeiger sind nur Verweise auf Stellen innerhalb. Da kriegst du das nur getauscht, indem du die Inhalte umkopierst.

Mit der auskommentierten Definition (char *sortlist[10]) und Pablos Swap-Funktion würde es gehen, aber wahrscheinlich kriegst du da erst mal SegFaults, weil kein gültiger Speicher da ist. Also vorher malloc'en oder new'en.


Zitat:
fachhochscule

Noch eine Bitte, gib dir sprachlich etwas mehr Mühe. Dein letztes Posting hat eine Fehlerdichte, die ein flüssiges Lesen unmöglich macht. Bei Grundschülern kann man über sowas hinwegsehen, aber nicht bei erwachsenen Menschen.

Gruß,
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.10.2005, 14:08 Uhr
Pablo
Supertux
(Operator)



Zitat von ~dt2158:


das mit den zeigern hab ich grundsätlich schon verstanden,



tut mir leid, aber das kann ich dir nicht glauben, sonst haettest du solche Fehler (wie bei swap) nicht gemacht.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.10.2005, 15:10 Uhr
~dt2158
Gast


es is halt total verwirrend das ein sprache keine strings "kann", dass dann mit mehr dimensionalen arrays oder zeigern zu lösen erscheint halt bescheiden

bitte nich angepisst fühlen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
28.10.2005, 09:31 Uhr
ao

(Operator)



Zitat von ~dt2158:
es is halt total verwirrend das ein sprache keine strings "kann",

Das ist einer der Gründe dafür, dass C in manchen Kreisen abwertend als portabler Makroassembler bezeichnet wird.

Es ist aber auch ein Grund dafür, dass C-Compiler einfach aufgebaut und leicht zu portieren sind, und dass C eine Verbreitung gefunden hat wie keine andere Sprache.

Es stimmt auch nicht, dass C keine Strings kann. Es gibt keinen eigenen Datentyp dafür, das stimmt. Aber es gibt ein geschlossenes Konzept, wie Strings dargestellt und verarbeitet werden können. Das ist ein primitives und mutet dem Programmierer einiges an Arbeit zu, aber wenn man die Regeln versteht und sich dran hält, funktionierts.

Und man darf nicht vergessen, dass C nicht mit dem Ziel entworfen wurde, eine leicht handhabbare Einsteigersprache zu sein.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: