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.


  • Mod

    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 so

    mat = 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ächst

    Wenn 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 pointer

    Danke 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;
    }
    

Anmelden zum Antworten