Metalmind Geschrieben 17. Juni 2010 Geschrieben 17. Juni 2010 Moin, es ist mir echt unangenehm so viele Threads für ein Programm zu öffnen, aber ich weiß echt nicht mehr weiter... Ich möchte ein zweidimensionales char Array durch selbstgeschriebene Quicksort und Bubblesort-Funktionen sortieren lassen, leider funktioniert das ganze nicht wie geplant. Mein Code:int laenge; void swap2(char *array1, char *array2) //tauscht String1 und String2 { char tmp[100]; 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]); } } } } scmp( void *sp1, void *sp2 ) //comparator-Argument für die Quicksort-Funktion (alphabetisch) { return( strcmp(*(char **)sp1, *(char **)sp2) ); } int i; int j; char Woerter[100][20]; //das zu sortierende Array int main (void) { laenge=0; do { error = fscanf(data1,"%s",Woerter[laenge]); //Daten werden dynamisch eingelesen laenge++; //um die Anzahl der Datensätze zu zählen, in meinem Fall =10 } while (error != EOF); //Bis die Datei am Ende ist laenge--; //Da der Durchlauf in dem festgestellt wird, dass die Datei zuende ist, ebenfalls mitgezählt wird Soweit wird das Array beschrieben und die Funktionen für Bubblesort und Quicksort sind erstellt, nun möchte ich das Array in die Funktionen einsetzen (die Compilerfehler treten alle hier auf): qsort(Woerter,laenge,sizeof(char),scmp); oder LexBubblesort(Woerter); Beim Bubblesort bekomme ich eine Compilerwarnung wegen inkompatiblen Zeigertypen und beim Quicksort bekomme ich eine Compilerwarnung in Argument 4. Nun habe ich schon einige Zeit daran rumgedoktort und komme einfach nicht darauf wo mein Fehler ist. Kann mir dabei jemand helfen und mir sagen was ihr von meinem Code haltet? Ich bin dankbar für jeden Tipp. Gruß und vielen lieben Dank! Metalmind Zitieren
Klotzkopp Geschrieben 17. Juni 2010 Geschrieben 17. Juni 2010 Da sind mehrere Fehler drin. free darfst du nur auf Zeiger anwenden, die du mit malloc reserviert hast.Der Parametertyp von LexBubblesort passt nicht. char *array[] deklariert ein Array von Zeigern. Du brauchst einen Zeiger auf ein Array, und du musst die Länge des Arrays angeben: char(*array)[20].Die Parametertypen deiner Quicksort-Vergleichsfunktion müssen const void sein.Du willst doch char-Arrays der Länge 20 sortieren. Also musst du bei qsort auch diese Größe angeben, nicht sizeof(char).strcmp allein liefert dir keine alphabetische Sortierung, weil damit Großbuchstaben grundsätzlich vor Kleinbuchstaben einsortiert werden. Zitieren
Metalmind Geschrieben 17. Juni 2010 Autor Geschrieben 17. Juni 2010 Danke! Ich habe deine Tipps eingefügt und der Bubblesort arbeitet jetzt einwandfrei! Der Quicksort macht noch einige Probleme, wenn ich das Array sortieren will stürzt das Programm ab. Ist Quicksort überhaupt für zweidimensionale Arrays geeignet? Das mit strcmp dürfte kein Problem sein, da alle Wörter groß geschrieben werden. Gruß und Danke für die schnelle Hilfe! Metalmind Zitieren
Klotzkopp Geschrieben 17. Juni 2010 Geschrieben 17. Juni 2010 Der Quicksort macht noch einige Probleme, wenn ich das Array sortieren will stürzt das Programm ab. Ist Quicksort überhaupt für zweidimensionale Arrays geeignet?Der Cast auf (char**) ist falsch, wenn du zweidimensionale char-Arrays sortierst. Da kommen dann die Adressen der Unter-Arrays rein, und die entsprechen der Adresse des ersten Zeichen. Mach mal ein paar Sternchen weg: return strcmp((char*)sp1, (char*)sp2); Zitieren
Metalmind Geschrieben 17. Juni 2010 Autor Geschrieben 17. Juni 2010 Danke, funktioniert alles wunderbar! Du bist ein Genie Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.