Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Guten Tag allerseits,

ich soll ein Programm schreiben welches Zahlen aus einer txt Datei ausliest und zu einem Sudoku zusammensetzt. Die Verarbeitung der Zahlen, Regeln, etc. ist alles schon fertig jedoch krieg ich jedes Mal ein "Speicherzugriffsfehler". Ein ähnlicher Fall hab ich hier schonmal gesehen und hatte gehofft hier eine Antwort zu finden. Ich vermute es liegt an meinem Speichermanagment aber leider komme ich nicht auf den Fehler. Ich hab fgets/fscanf mit realloc/free probiert aber kein Erfolg.
Meine Main sieht so aus:

char* zeile_sudoku;
    char** inhalt_sudokus;

    //Speicher reservieren
    inhalt_sudokus=(char**)malloc(sizeof(char*)*anzahl_zeilen-1);
    for(a=0;a<anzahl_zeilen;a++){
        inhalt_sudokus[a]=(char*)malloc(sizeof(char)*81);
    }

    zeile_sudoku=(char*)malloc(sizeof(char)*81);

    sudoku_txt=fopen("Sudokus.txt"],"r");

    //Überprüfen ob die Datei überhaupt geöffnet werden konnte
    if(sudoku_txt==NULL){
        printf("Fehler beim lesen der Datei %s\n",argv[1]);
        return -1;
    }else{
        //Zeilenweise die txt datei auslesen udn einspeichern
        for(a=0;a<anzahl_zeilen;a++){
            fscanf(sudoku_txt,"%s\n",&inhalt_sudokus[a]);
            printf("%d:\t%s\n",a,inhalt_sudokus[a]);
            inhalt_sudokus[a]=realloc(inhalt_sudokus[a],strlen(inhalt_sudokus[a]));

        }
    fclose(sudoku_txt);
    }

printf("Herzlich Willkommen! Bitte eine Schwierigkeit auswählen\n");
    printf("1:\tSehr Einfach\n2:\tEinfach\n3:\tMittel\n4:\tSchwer\n5:\tSehr Schwer\n");
    scanf("%d",&auswahl_1);
    printf("Wollen sie das erste (1) oder zweite (2) Sudoku spielen?\n");
    scanf("%d",&auswahl_2);

    //Die zweite Auswahl überprüfen
    if(auswahl_2!=1 && auswahl_2!=2){
        printf("Eingabe unbekannt! Abbruch!\n");
        return -1;
    }

    //Die richtige Zeile auswählen basierend auf der Wahl des Benutzers
    switch(auswahl_1){
    case 1:         //Sehr Einfach (Zeile 1+3)
        switch(auswahl_2){
        case 1:zeile=2;
        break;
        case 2:zeile=3;
        break;
        }
        break;
    case 2:         //Einfach (Zeile 6+8)
        switch(auswahl_2){
        case 1:zeile=5;
        break;
        case 2:zeile=6;
        break;
        }
        break;
    case 3:         //Mittel (Zeile 11+13)
        switch(auswahl_2){
        case 1:zeile=8;
        break;
        case 2:zeile=9;
        break;
        }
        break;
    case 4:         //Schwer (Zeile 16+18)
        switch(auswahl_2){
        case 1:zeile=11;
        break;
        case 2:zeile=12;
        break;
        }
        break;
    case 5:         //Sehr Schwer (Zeile 21+23)
        switch(auswahl_2){
        case 1:zeile=15;
        break;
        case 2:zeile=16;
        break;
        }
        break;
    default:
        printf("Eingabe unbekannt! Abbruch!\n");
        return -1;
        break;
    }

zeile_sudoku=inhalt_sudokus[zeile];

    for(a=0;a<anzahl_zeilen;a++){
        free(inhalt_sudokus[a]);
    }

    laenge_zeile=strlen(zeile_sudoku);
    printf("Erfolg nach Strlen\n");

    //Den String Zeichenweise in Int umwandeln
    c=0;
    for(a=0;a<9;a++){
        for(b=0;b<9;b++){
            sudoku[a]=(zeile_sudoku[c])-'0';
            if(sudoku[a]==0){freie_felder++;}
            c++;
        }
    }

    free(zeile_sudoku);

//Noch mehr Programm welches kein dyn. Array mehr benutzt

 

Ich öffne die C Datei in der Linux Konsole wie folgt:
gcc Sudoku.c
./a.out 

Folgendes passiert in der Konsole:
0:    sehr
1:    einfach:
2:    076194380504783296938052174625941837490328051000576409169237548053419700042065910
3:    162983574745612398098547216004008001231765080907401652023170905019324867476059123
4:    Einfach:
5:    009207405500086001102540900020090008007000600900760032000001706000052004601409200
6:    040075098900680200783219050078521469024908710510060002492756800105043007807100040
7:    Mittel:
8:    400629000600570030021030005000890000048300279000054100200045801060003004004102007
9:    080060070009074000060008000290650000800047000400892050008230900340080165900000830
10:    Schwierig:
11:    207040000000500009000000010006100300000900200080000000000082700950000000000000000
12:    000000000000060001305000040080000900009000050000100300100000000000003000260800004
13:    Sehr
14:    Schwierig:
15:    100008700060031000305000000008090006006000500400070300000000804000960030009400001
16:    050000406309000080076000002000000037000064500000090200500032000040100000908500000

Herzlich Willkommen! Bitte eine Schwierigkeit auswählen
1:    Sehr Einfach
2:    Einfach
3:    Mittel
4:    Schwer
5:    Sehr Schwer
1
Wollen sie das erste (1) oder zweite (2) Sudoku spielen?
1
Speicherzugriffsfehler
 

Ich würde mich um jede Hilfe freuen.
Gruß Leo

eventuell das doppelte free?

vor 7 Stunden schrieb noob4326:

zeile_sudoku=inhalt_sudokus[zeile];

tut nicht das was du vermutlich erwartest. ich bekomm den SegFault allerdings erst beim 2ten "free".

P.S.: gcc -g -Wall Sudoku.c

Bearbeitet von _n4p_

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.