C Viel zu viele Bäume(die Planze) (Problem beim Sudoku lösen)

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:
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:
das was du da rot markiert hast ist der totale quark.. ebenso hast du da diverse weitere fehler drin.

int readfile(char outfile[50])
-> int readfile(const char *outfile)


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;

}
scanf() kannst du so NICHT nutzen! wenn jemand mehr als 49 zeichen eingibt hast du nen buffer overflow!
du kannst allenfalls
scanf("%49s", &outfile);
verwenden. von scanf() würde ich aber ohnehin grundsätzlich abraten.
 
Sudoku, eh? Du studierst nich zufällig (Medien)Informatik an ner größeren sächsischen Hochschule oder ;) ?
 
Zurück
Oben