DeusExMachina
Lt. Junior Grade
- Registriert
- Jan. 2008
- Beiträge
- 267
Moin Moin,
ich habe versucht ein Soduko Löser zu schreiben (zum großen teil basiert er auf dem Code von Daniel Brettschneider ((ich kam zwar auf ähnliche subroutinen aber seine waren na sagen wir mal eleganter als das was ich zusammen gestückelt habe)) leider bekomme ich folgende fehler meldungen wenn ich versuche das ganze so aus zu führen das er *.dat dateien aus dem ordner in dem er sich befindet zu öffenen:
warning C4047: 'function' : 'char ' differs in levels of indirection from 'char [50]'
warning C4024: 'readfile' : different types for formal and actual parameter 1
warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char '
warning C4024: 'fopen' : different types for formal and actual parameter 1
warning C4761: integral size mismatch in argument; conversion supplied
Der Code ist der zeit der Folgende:
wäre für eine Hilfestellung oder einen Denkanstoß sehr dankbar.
TANTE EDIT: Hab die Fehlergefunden meine Fresse war das doof komisch wie leicht einem die Fehlersuche fällt wenn man das Problem auf andere "abwälzt" und es nicht mehr bewußt beachtet
ich habe versucht ein Soduko Löser zu schreiben (zum großen teil basiert er auf dem Code von Daniel Brettschneider ((ich kam zwar auf ähnliche subroutinen aber seine waren na sagen wir mal eleganter als das was ich zusammen gestückelt habe)) leider bekomme ich folgende fehler meldungen wenn ich versuche das ganze so aus zu führen das er *.dat dateien aus dem ordner in dem er sich befindet zu öffenen:
warning C4047: 'function' : 'char ' differs in levels of indirection from 'char [50]'
warning C4024: 'readfile' : different types for formal and actual parameter 1
warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char '
warning C4024: 'fopen' : different types for formal and actual parameter 1
warning C4761: integral size mismatch in argument; conversion supplied
Der Code ist der zeit der Folgende:
Code:
//Includes
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//Globale und Statics
#define G 9 //Festerwert für die Sudoukugröße
static int matrix[G][G]; //Erstellen der Speichermatrix
static int loesungen = 0;
//Funktionen
int printmatrix();
int readfile(char outfile[COLOR="Red"][50][/COLOR]);
int check(int x, int y, int wert);
int checkHorizontal(int y, int wert);
int checkVertical(int x, int wert);
int checkBox(int x, int y, int wert);
int solve(int x, int y);
int main()
{
char outfile[50];
printf("Welches Sudoku soll geloest werden?\n");
scanf("%s", &outfile);
if(readfile(outfile) < 0)
return -1;
printmatrix();
solve(0, 0);
printf("Loesungen: %d\n", loesungen);
return 0;
}
//Input & Output Funktionen
//Input inkl Einlesen der Speicherdateipfades
int readfile(char outfile[COLOR="Red"][50][/COLOR])
{
FILE *fp;
int i, j;
char temp[G+3] = {0};
if((fp = fopen(outfile, "rb")) == NULL) {
printf("Datei %s nicht gefunden!\n", outfile);
return -1;
}
for(i = 0; i < G; i++) {
if(fgets(temp, G + 3, fp) == NULL) {
printf("Daten nicht vollstaendig!\n");
fclose(fp);
return -1;
}
for(j = 0; j < G; j++) {
matrix[i][j] = temp[j] - '0';
}
}
fclose(fp);
return 0;
}
int printmatrix()
{
int spalte, zeile;
printf("+---+---+---+---+---+---+---+---+---+"); //oberer Rahmen der Ausgabe,
for(zeile=0; zeile<9; zeile++) //Beginn der Ausgabe Schleife, und äussere Abbruchbedingung
{
for(spalte=0;spalte<9;spalte++) //Innere Schleife und Innere Abbruchbedingung
{
if(matrix[zeile][spalte]==0) //Prüfen ob das Feld in der Speichermatrix leer ist
printf("| "); //Ausgabe im Falle das
else //ansonsten (ohne weitere Prüfung)
printf("| %d ", matrix[zeile][spalte]); //Ausgabe des Wertes des Entsprechenden Feldes der Speichermatrix
}
printf("|\n");
printf("+---+---+---+---+---+---+---+---+---+");
}
return 0;
}
//Prüffunktionen zum Lösen des Sodokus:
//Prüfen ob das Soduko korrekt befüllt wurde:
int check(int x, int y, int wert)
{
if(checkHorizontal(y, wert))
return 1;
if(checkVertical(x, wert))
return 1;
if(checkBox(x, y, wert))
return 1;
return 0;
}
//Prüfen der Zeilen
int checkHorizontal(int y, int wert)
{
int i;
for(i = 0; i < G; i++)
if(matrix[y][i] == wert)
return 1;
return 0;
}
//Prüfen der Spalten
int checkVertical(int x, int wert)
{
int i;
for(i = 0; i < G; i++)
if(matrix[i][x] == wert)
return 1;
return 0;
}
//Prüfen der einzelnen Boxen
int checkBox(int x, int y, int wert)
{
int x_box, y_box, i, j;
/* Obere linke Ecke des Box ermitteln */
x_box = (int)(x / 3) * 3;
y_box = (int)(y / 3) * 3;
for(i = y_box; i < y_box + 3; i++)
for(j = x_box; j < x_box + 3; j++)
if(matrix[i][j] == wert)
return 1;
return 0;
}
/**********************************************************
*******************DER LÖSUNGSALGORITHMUS *****************
**********************************************************/
int solve(int x, int y)
{
int i;
if(x == G) { /* Zeilenende erreicht */
y++;
x = 0;
if(y == G) /* Ende erreicht */
return 1;
}
if(matrix[y][x] > 0) /* Feld schon gesetzt */
return solve(x+1, y); /* Naechstes Feld */
for(i = 1; i <= G; i++) { // Keine Zahl vorhanden
if(!check(x, y, i)) { // Alle Zahlen durchgehen
matrix[y][x] = i; // Wenn Zahl passt, setzen
if(solve(x+1, y)) { // Naechstes Feld pruefen
loesungen++; // Loesung gefunden, ausgeben
printf("Loesung %d:\n", loesungen);
printmatrix();
printf("\n");
/*return 1;*/ /*<-- Nur eine Loesung ausgeben */
}
}
}
matrix[y][x] = 0; // wenn keine Zahl gepasst hat, den Wert wieder 0 setzen
return 0;
}
wäre für eine Hilfestellung oder einen Denkanstoß sehr dankbar.
TANTE EDIT: Hab die Fehlergefunden meine Fresse war das doof komisch wie leicht einem die Fehlersuche fällt wenn man das Problem auf andere "abwälzt" und es nicht mehr bewußt beachtet
Zuletzt bearbeitet: