Status_access_violation Fehler



  • Hallo Community,

    hier ein Programm, welches einen Status_access_violation Fehler ausgibt.
    Es soll Datn aus einer csv-Datei einlesen und ausgeben die mit ";" getrennt sind.

    Name;Nachname;email
    Name;Nachname;email
    Name;Nachname;email

    Hier mal der Code

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Daten
    {
        char vorn[40];
        char name[40];
        char email[40];
    };
    
    void clearbuf()
    {
        setvbuf(stdin,NULL,_IONBF,0);
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
    }
    
    int main()
    {
        FILE *fz = NULL;
        struct Daten *daten = NULL;
        int x = 1;
        int i;
    
        fz = fopen ("cs.csv", "r");
    
        if (fz == NULL)
        {
            printf ("Fehler beim Oeffnen von %s\n");
            clearbuf();
            getchar();
            return 1;
        }
    
        while(1)
        {
            daten = realloc(daten, sizeof(struct Daten));
            if(daten == NULL)
            {
                printf ("Es konnte kein Speicher angelegt werden.\n");
                clearbuf();
                getchar();
                return 1;
            }
    
            if(fscanf(fz, "%[^;];%[^;];%[^\n]\n", daten[x - 1].name, daten[x - 1].vorn, &daten[x - 1].email) == EOF)
                break;
    
            x++;
        }
    
        for(i = 0; i < x; i++)
        {
            printf("%s, %s, %s\n", daten[i].vorn, daten[i].name, daten[i].email);
        }
    
        clearbuf();
        getchar();
        return 0;
    }
    

    Ich vermute nur mal, dass er vielleicht wegen dem "struct Daten" rummeckert, weil ihm keine Bitgröße zugeteilt ist, was meint ihr? 😕



  • Ich meine, dass du dir nochmal ansehen solltest, was realloc tut.



  • Dynamisch Speicher reservieren und?



  • Plürr schrieb:

    Dynamisch Speicher reservieren und?

    Hast du es dir nochmal angesehen?



  • Ja, gerade eben. Nur muss ich sagen, dass ich nicht gerade der Champ in
    dingen wie Arrays und malloc, calloc oder realloc bin.
    Muss man nicht zuvor mit malloc oder calloc arbeiten um danach realloc zu benützen?



  • Plürr schrieb:

    Ja, gerade eben. Nur muss ich sagen, dass ich nicht gerade der Champ in
    dingen wie Arrays und malloc, calloc oder realloc bin.
    Muss man nicht zuvor mit malloc oder calloc arbeiten um danach realloc zu benützen?

    Nein muss man nicht umbedingt, wenn man einen NULL Pointer übergibt verhält realloc sich wie malloc.
    Beim schnellen durchlesen fällt auf dass du die Größe des zu reservierenden Speichers nicht erhöhst. realloc hat also beim zweiten Durchlauf keinen Effekt mehr.



  • Hmmm...

    daten = realloc(daten, x * sizeof 80);
    

    Leider kann ich im mom keinen Debugger hernehmen, da meine IDE paar Probleme hat.



  • Okay, ich hab es nun mit

    daten = realloc(daten, x * sizeof 8);
    

    Und es funktioniert auch so, nur der Ausgabewert ist nochnicht das richtige.



  • Plürr schrieb:

    Und es funktioniert auch so, nur der Ausgabewert ist nochnicht das richtige.

    D.h., es funktioniert eigentlich nicht?

    Warum sizeof 8? Warum nicht sizeof(struct Daten)?



  • Naja fast, eher sizeof(struct Daten) . sizof 80 würde im besten Fall 4 für einen int liefern, falls das überhaupt geht. Nach Adam Ries wären es bei dir aber trotzdem immer noch 120 Bytes für eine Struktur.



  • Es war lediglich ein Versuch, dass es überhaupt eine Ausgabe gibt.
    Sag du mir bitte warum es mit (struct Daten) nicht funktioniert.
    Eine Erklärung hab ich dazu leider nicht.



  • Was funktioniert mit struct Daten nicht? sizeof sollte dir zuverlässig deine 120 zurück liefern. Mach doch einfach mal zum Test ein printf und lasse dir den Wert ausgeben. Wenn du dann immer noch skeptisch bist, kannst du auch einfach deine 120 fest rein schreiben. Das gibt nur dann Probleme, wenn die Struktur mal eine andere Größe haben sollte. Beispielsweise wenn char plötzlich 2 Byte groß ist, oder du merkst dass 39 Zeichen doch ein wenig eng sind.



  • Das Problem ist, am Anfang war es ja (struct Daten), nur da kam ja dann immer
    als Ausgabe nur der "status_access_violation" Fehler raus.



  • Okay, *hust* wie durch ein "Wunder" funktioniert es jetzt komischerweise mit "struct Daten".



  • fällt euch eigentlich noch etwas ein wie man die "Software" automatisch auf Fehler testen lassen kann? Gibt es da irgendeinen Programmschnipsel, oder irgendwelche bestimmte Funktionen die sich dafür gut eignen?



  • Plürr schrieb:

    Okay, *hust* wie durch ein "Wunder" funktioniert es jetzt komischerweise mit "struct Daten".

    Das entscheidende war das

    x *
    

    Plürr schrieb:

    Gibt es da irgendeinen Programmschnipsel, oder irgendwelche bestimmte Funktionen die sich dafür gut eignen?

    Wenn du mit solchen Konstrukten Probleme hast, solltest du vielleicht eine Programmiersprache wählen, die solche Fehler während der Laufzeit abfängt, wie Java.



  • Nein, das nicht. Aber ich würd gerne mal so etwas in der Richtung mal gerne sehen.
    Es ist immer nützlich so einen Test dafür zu haben. 😃
    Außerdem, hab ich Java auch schon etwas "Einsteigererfahrungen".



  • Oder C++ ! 😉



  • Standard C bietet assert an, daneben auch perror.



  • Plürr schrieb:

    void clearbuf()
    {
        setvbuf(stdin,NULL,_IONBF,0);
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
    }
    

    Was ist denn das schon wieder? setvbuf macht keine rückwirkenden Aktionen auf den Stream. Es muss doch schwierig sein, nach den hier schon mehrfach genannten standardkonformen und funktionierenden Varianten zu suchen.


Anmelden zum Antworten