noob4326 Geschrieben 19. Februar 2020 Geschrieben 19. Februar 2020 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 Zitieren
_n4p_ Geschrieben 19. Februar 2020 Geschrieben 19. Februar 2020 (bearbeitet) 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 19. Februar 2020 von _n4p_ 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.