Zweidimensionales Char Array mit Bubblesort sortieren



  • Moin,
    ich habe ein kleines Problem meine Bubbleosort-Funktion zum laufen zu kriegen, der Hauptteil:

    void LexBubblesort(char *array)
    {
       int j;
       int i;
       char *tmp;
       for (i=0; i < laenge - 1; i++) {
          for (j=0; j<laenge - 1; j++) {
             if (strcmp(array[j], array[j+1]) > 0) {
                tmp = array[j];
                array[j] = array[j+1];
                array[i+1] = tmp;
             }
          }
       }
    }
    

    scheint so zu funktionieren, nun möchte ich in diese Funktion die Variable:

    char Bezeichnung[100][20];
    

    einfügen, leider bekomme ich beim einsetzen:

    LebBubblesort(*Bezeichnung);    //mit oder ohne * der selbe Fehler
    

    die Fehlermeldung "warning: passing arg 1 of `LexBubblesort' from incompatible pointer"

    Was muss ich tun um mein zweidimensionales Array von dieser Funktion sortieren zu lassen?

    Danke und Gruß an alle!
    Metalmind


  • Mod

    Also übergeben kannst du es zum Beispiel mit LebBubblesort(&Bezeichnung[0][0]); . Pass aber auf, dass die Länge dann 20*100=2000 ist.



  • Würde LebBubblesort(&Bezeichnung[0][0]); denn ausreichen? Würde das nicht quasi nur den Teil [0][0] sortieren?

    SeppJ schrieb:

    Pass aber auf, dass die Länge dann 20*100=2000 ist.

    Sorry, aber was meinst du damit?



  • Metalmind01 schrieb:

    Würde LebBubblesort(&Bezeichnung[0][0]); denn ausreichen? Würde das nicht quasi nur den Teil [0][0] sortieren?

    Das würde quasi garnichts sortieren.
    Beim Hochzählen von array[j] nach array[j+1] weiß innerhalb der Sortierfunktion niemand, um wieviel Bytes der Zeiger 'weiterhüpfen' soll.
    Übergib doch nen Zeiger auf char* :

    void bubble_me ( char** a, unsigned n ) 
    { 
       int j, i; char* tmp;
    
       for ( i = 0; i < n-1; i++ )
          for ( j = 0; j < n-1; j++ )
             if ( strcmp ( a[j], a[j+1]) > 0 )
                tmp = a[j], a[j] = a[j+1], a[j+1] = tmp; 
    }
    
    void gucki_guck ( char** a, unsigned n )
    {
    	unsigned i = 0;
    	while ( i < n )
    		puts ( a[i] ), i++;
    }
    
    int main()
    {
    	char a[][20] = { "ddd", "bbb", "aaa" };
    	char* pa[] = { &a[0], &a[1], &a[2] };
    	bubble_me ( pa, sizeof ( pa ) / sizeof ( *pa ));
    	gucki_guck ( pa, sizeof ( pa ) / sizeof ( *pa ));
    	return 0;
    }
    


  • void bubble_me ( char** a, unsigned n )
    {
    int j, i; char* tmp;

    for ( i = 0; i < n-1; i++ )
    for ( j = 0; j < n-1; j++ )
    if ( strcmp ( a[j], a[j+1]) > 0 )
    tmp = a[j], a[j] = a[j+1], a[j+1] = tmp;
    }

    void gucki_guck ( char** a, unsigned n )
    {
    unsigned i = 0;
    while ( i < n )
    puts ( a[i] ), i++;
    }

    int main()
    {
    char a[][20] = { "ddd", "bbb", "aaa" };
    char* pa[] = { &a[0], &a[1], &a[2] };
    bubble_me ( pa, sizeof ( pa ) / sizeof ( *pa ));
    gucki_guck ( pa, sizeof ( pa ) / sizeof ( *pa ));
    return 0;
    }[/cpp]

    Also wenn ich das richtig gesehen habe ist deine Funktion bubbl_me meine Bubblesort-Funktion, nur dass ich die länge, bei dir n, als feste Variable eingefügt habe.
    gucki_guck ist die Ausgabe, quasi das printf(), soweit richtig?

    Könntest du mir bitte erklären warum du in char a[][20] in die erste Klammer nichts eingetragen hast, ebenso wie in pa?

    Danke für das Beispiel,



  • Metalmind01 schrieb:

    Also wenn ich das richtig gesehen habe ist deine Funktion bubbl_me meine Bubblesort-Funktion, nur dass ich die länge, bei dir n, als feste Variable eingefügt habe.

    Jo. Umbenannt, um einen Parameter erweitert und optisch ein bisschen aufgepeppt.
    Und einen schwerwiegenden Indexfehler korrigiert i+1 -> j+1.

    Metalmind01 schrieb:

    gucki_guck ist die Ausgabe, quasi das printf(), soweit richtig?

    Jepp. Die Funktion gibt alle Zeichenketten aus.

    Metalmind01 schrieb:

    Könntest du mir bitte erklären warum du in char a[][20] in die erste Klammer nichts eingetragen hast, ebenso wie in pa?

    So lassen wir das den Compiler zählen, man kann aber auch einen festen Wert eingeben.



  • Meine Funktion sieht nun so aus:

    void swap2(char *array1, char *array2)    //tauscht Variable a und b       
    {   
    	char *tmp;
    	tmp = (char*) malloc(laenge*20*sizeof(char*));
        strcpy(tmp,array1);
        strcpy(array1,array2);
        strcpy(array2,tmp);
    	free(tmp);
        return;
    }
    
    void LexBubblesort(char *array[])    //Bubblesort-Funktion für alphabetische Arrrays
    {
        int j;
        int i;
        for (i=0; i < laenge - 1; i++) {
            for (j=0; j<laenge - 1; j++) {
                if (strcmp(array[j], array[j+1]) > 0) {
                    swap2(array[j],array[j+1]);
                }
            }
        }
    }
    

    Nun muss ich in diese Funktion nurnoch das Array eingesetzt bekommen. Ich versuche es nach dem Schema: LexBubblesort(Woerter); wobei das Array das Aussehen char Woerter[100][20]; hat.
    Leider bekomme ich dabei einen Compilerfehler wegen inkompatiblen Zeigertypen, weiß jemand wie ich dieses Array dort einfügen kann?
    Lieber Gruß!
    Metalmind


Log in to reply