C Sortieren mit Pointern
-
Hi Leute,
im Rahmen meines Informatikstudiums soll ich mit Pointern eine Textfile zeilenweise sortieren. Das ganze soll so ablaufen, dass über Fileumlenkung eine Textdatei eingelesen, sortiert und in der Konsole sortiert ausgegeben werden soll.
Damit nicht immer die ganzen Speicherelemente kopiert werden müssen, sollen also nur die Pointer auf die jeweilige Zeile verglichen werden und wenn nötig vertauscht (Bubblesort). Die Anzahl der Zeilen des Textes, der in das Array eingelesen wird, soll durch calloc dynamisch erweiterbar sein.
Ehrlich gesagt, verstehe ich das Prinzip der Pointer zwar, an der Realisierung scheiterts im Moment aber noch etwas.
Bei dem Code bekomme ich immer "Speicherzugriffsfehler" als Fehler zurück, wenn ich probiere den Beleg mit Fileumlenkung auszuführen.Mein Code bisher:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxCharPerLine 100 int main() { int **pop = NULL; // Pointer auf Pointer int i = 0; char tmp[MaxCharPerLine] = {0}; char *mat = NULL; while(fgets(tmp, MaxCharPerLine, stdin) != NULL) { mat = (char *)calloc(strlen(tmp),sizeof(char)); if(tmp[strlen(tmp) - 1] == '\n') { tmp[strlen(tmp) - 1] = '\0'; } strcpy(mat,tmp); *(pop + i) = mat; i++; } sort(pop,i); printMatrix(tmp); return 0; } int sort(char **pop,int l) { int notsorted = 1; int count; char *tmp2; while(notsorted) { for(count = 0; count < l - 1; count ++) { tmp2 = * (pop + count); *(pop + count) = * (pop + count); *(pop + count + 1) = tmp2; notsorted++; } } l--; return 1; } int printMatrix(char tmp[MaxCharPerLine]) { int i = 0; for (i = 0; i < strlen(tmp); i++) { printf("%d ", *(tmp+i)); } return 1; }
Ich denke, dass es an Zeile 21 oder 22 liegt, kann aber einfach keinen Fehler entdecken.
-
Vermutlich solltest du pop auf etwas zeigen lassen.
-
Du willst doch pop wie ein Array von char* benutzten.
Wo belegst du denn Speicher für pop?Dafür solltest du dann aber realloc nehmen.
Ich bin der Meinung, dass das '\n' zur Zeile gehört.
-
camper schrieb:
Vermutlich solltest du pop auf etwas zeigen lassen.
Lass ich pop nicht mit
*(pop + i) = mat;
auf die Werte von mat zeigen?
DirkB schrieb:
Du willst doch pop wie ein Array von char* benutzten.
Wo belegst du denn Speicher für pop?Hab jetzt mal
pop = (char *)realloc(strlen(mat),sizeof(char));
noch hinzugefügt.
DirkB schrieb:
Ich bin der Meinung, dass das '\n' zur Zeile gehört.
Das mit dem '\n' ist schon so gewollt, wir mussten das ganze sortieren vorher schon ohne Pointer machen und da wurde uns geraten, das so zu machen.
-
du müsstest pop auf gültigen Speicher zeigen lassen
und bei jedem push kontrollieren ob der Speicher groß genug ist
denn pop soll ja quasi ein array of array of char werden (ja ich weiß das ein pointer kein array ist)
mit dem Stack implementiert wird und das dabei dynamisch wächst
Zeile 15 vll somat = calloc(strlen(tmp) +1 ,sizeof(*mat)); //platz für \0 nicht vergessen if(mat == NULL) { // möglichen Fehler behandeln perror("calloc"); panic(); }
-
gary1195 schrieb:
du müsstest pop auf gültigen Speicher zeigen lassen
und bei jedem push kontrollieren ob der Speicher groß genug ist
denn pop soll ja quasi ein array of array of char werden (ja ich weiß das ein pointer kein array ist)
mit dem Stack implementiert wird und das dabei dynamisch wächstWenn ich deinen Code nehme und den Rest bei mir auskommentiere, kommt wieder ein Speicherzugriffsfehler, bei meiner Zeile:
pop = (char *)realloc(strlen(mat),sizeof(char));
nicht. Weißt du, woran das liegen kann?
-
du benutzt realloc falsch und prüfst nicht auf fehler guckst du zB hier http://man.cx/realloc
pop hat den typ char**
bitte caste in C keine void pointer
-
gary1195 schrieb:
du benutzt realloc falsch und prüfst nicht auf fehler guckst du zB hier http://man.cx/realloc
pop hat den typ char**
bitte caste in C keine void pointerDanke für den Tipp, ich stand grade schon ziemlich auf dem Schlauch..^^
Ich hab mein Programm erstmal soweit abgeändert, dass es anscheinend alle Zeilen einliest, aber noch nicht richtig sortiert. Ob auch die richtigen Sachen eingelesen wurden, kann ich noch nicht wirklich sagen, da das ausgeben noch nicht so wirklich klappt.
Hier erstmal meine geänderte Version:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxCharPerLine 100 int main() { int i = 0; char tmp2[MaxCharPerLine] = {0}; char tmp[MaxCharPerLine] = {0}; char *mat = NULL; int **pop = NULL; // Pointer auf Pointer while(fgets(tmp, MaxCharPerLine, stdin) != NULL) { mat = calloc(strlen(tmp) + 1 ,sizeof(*mat)); if(mat == NULL) { perror("calloc"); } pop = realloc(*mat,sizeof(char)); if(tmp[strlen(tmp) - 1] == '\n') { tmp[strlen(tmp) - 1] = '\0'; } strcpy(mat,tmp); *(pop + i) = mat; i++; } printf("Anzahl eingelesener Zeilen: %d\n", i); sort(pop,i); printMatrix(tmp2); return 0; } int sort(char **pop,int i) { int notsorted = 0; int count; char *tmp2; while(notsorted == 0) { for(count = 0; count < i - 1; count ++) { tmp2 = *(pop + count); *(pop + count) = * (pop + count); *(pop + count + 1) = tmp2; notsorted = 1; } } i--; return tmp2; } int printMatrix(char tmp2[MaxCharPerLine]) { int i = 0; for (i = 0; i < strlen(tmp2); i++) { printf("%d \n", *(tmp2+i)); } return 1; }