Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda sobre Sudoku

Estas en el tema de Duda sobre Sudoku en el foro de C/C++ en Foros del Web. Buenas noches a todos. Andaba con un sudoku que tengo que hacer para clase, y me he quedado atascado en un punto. El tema es ...
  #1 (permalink)  
Antiguo 05/12/2010, 15:12
 
Fecha de Ingreso: diciembre-2010
Mensajes: 1
Antigüedad: 13 años, 4 meses
Puntos: 0
Duda sobre Sudoku

Buenas noches a todos. Andaba con un sudoku que tengo que hacer para clase, y me he quedado atascado en un punto.

El tema es que, a partir de una función "menú", el usuario decide si quiere jugar al Sudoku, o al Harakiri. Y, una vez elegida esa opción, el nivel de dificultad. Por lo que, dependiendo de las opciones elegidas, tendrá que cargarse un archivo u otro (hay 6 posibilidades) con los números que conforman el tablero. Mi idea sería que, en una función, se abriese el archivo, dependiendo del tipo de juego y la dificultad. Y usar ese archivo en otra función, la cual trataría con él para guardar su contenido en un array de char. El código me da error y me temo que es porque no se cómo pasar un argumento tipo FILE por valor (si es que se puede).


Código:
void leer_fichero(char opcion, char nivel, FILE *F){

	if (opcion == 's'){ //Si queremos jugar sl sudoku

		if (nivel == 'f'){	 //Y queremos jugar al nivel fácil		

			F = fopen ("SudokuFacil.txt", "r");

			if ((F = fopen("SudokuFacil.txt", "r")) == NULL) {
				printf ("Error en la apertura. Es posible que el fichero no exista \n ");
			}		
		} else if (nivel == 'm'){
			/*hacemos lo mismo para el nivel medio*/

		}else{
			
			/*Igual para difícil*/

		}

	} else {
	}


}

void leer_dificultad(FILE F, char tabl[TAMH][TAMH]){

	char num;
	int i = 0;
	int j = 0;

	
	do{
		
		if (num != EOF){
			
                        num = (char)getc(F); //Leo caracter del fichero
			tabl[i][j] = num; //Y lo guardo en la posición correspondiente
			j++; //pasamos a la siguiente columna del tablero
			
                        if (j == 9){ //El tablero solo tiene 9 casillas. Al llegar a la novena, incrementamos una fila y ponemos las columnas a 0.

				j = 0;
				i++;
			}
		}
	}while(num != EOF);
	mostrar_tablero(tabl);	//función que muestra el sudoku por pantalla		
			
}
Visto que daba fallo de segmentación (el problema venía de la función leer_dificultad, porque por leer_fichero si llegaba a entrar), decidí cambiar la primera función para que guardase el nombre del archivo en un array de String, para luego pasárselo como parámetro por valor a FILE en la segunda función. Tampoco funcionó.

Código:
void leer_fichero(char opcion, char nivel, char *nombreFichero[50]){

	if (opcion == 's'){ //Si queremos jugar sl sudoku

		if (nivel == 'f'){	 //Y queremos jugar al nivel fácil		

			strcpy(*nombreFichero, "SudokuFacil.txt");

		} else if (nivel == 'm'){
			/*hacemos lo mismo para el nivel medio*/

		}else{
			
			/*Igual para difícil*/

		}

	} else {
	}


}

void leer_dificultad(FILE F, char tabl[TAMH][TAMH], char nombreFichero[50]){

	char num;
	int i = 0;
	int j = 0;

        F = fopen (nombreFichero, "r"); //le pasamos la cadena de texto guardada, que es el nombre del fichero.

	if ((F = fopen(nombreFichero, "r")) == NULL) {
				printf ("Error en la apertura. Es posible que el fichero no exista \n ");
			}
	do{
		
		if (num != EOF){
			
                        num = (char)getc(F); //Leo caracter del fichero
			tabl[i][j] = num; //Y lo guardo en la posición correspondiente
			j++; //pasamos a la siguiente columna del tablero
			
                        if (j == 9){ //El tablero solo tiene 9 casillas. Al llegar a la novena, incrementamos una fila y ponemos las columnas a 0.

				j = 0;
				i++;
			}
		}
	}while(num != EOF);
	mostrar_tablero(tabl);	//función que muestra el sudoku por pantalla		
			
}
Un saludo
  #2 (permalink)  
Antiguo 09/12/2010, 01:40
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Duda sobre Sudoku

La función fopen te devuelve un puntero a FILE, que es una estructura de datos definida en stdio.h. El error de segmentación te lo daba porque FILE no lo habías pasado como puntero pero estabas intentando utilizarlo en funciones que lo esperan como puntero.

Otra cosa que he visto es que cuando abres el fichero estás haciendo:

F = fopen(....);

y acto seguido haces

if ((F = fopen(....)) == NULL)

con lo cual estás abriendo el mismo fichero DOS veces sobre la misma estructura FILE. La segunda sobreescribe a la primera. Esto supone que, al finalizar el programa, aunque cierres el fichero (con fclose(F), que, por cierto, no veo que lo hayas hecho), aún se te puede quedar el fichero abierto, pudiendo pasar desde nada a encontrarte con un fichero inservible.

Y un mero detalle "estético", yo intercambiaría los nombres de las funciones. Estás llamando leer_fichero a la función donde estás leyendo la dificultad, y leer_dificultad a la función donde estás leyendo el fichero.

Yo dejaría algo así como:

Código C:
Ver original
  1. void leer_dificultad(void)
  2. {
  3.     char opcion, nombre_fichero[20];
  4.  
  5.     opcion = leer_opcion();  // Esta presentaría el menú de opciones disponibles
  6.     switch (opcion)
  7.     {
  8.         case 'f':
  9.             strcpy(nombre_fichero, "Facil");
  10.             break;
  11.         case 'm':
  12.             strcpy(nombre_fichero, "Medio");
  13.             break;
  14.         case 'f':
  15.             strcpy(nombre_fichero, "Dificil");
  16.             break;
  17.     }
  18.     leer_fichero(nombre_fichero);
  19. }
  20.  
  21. void leer_fichero(char *nombre)
  22. {
  23.     FILE *F;
  24.    
  25.     if ((F = fopen(nombreFichero, "r")) == NULL)
  26.     {
  27.         printf ("Error en la apertura\n");
  28.         return;
  29.     }
  30.     // Aquí leo el contenido del fichero
  31.     fclose(F);
  32. }

Claro está, el tema de parámetros, declaraciones, etc, tendrás que ponérselo en función del resto de tu programa.
  #3 (permalink)  
Antiguo 06/04/2011, 11:03
 
Fecha de Ingreso: abril-2011
Mensajes: 1
Antigüedad: 13 años
Puntos: 0
Respuesta: Duda sobre Sudoku

Hola, q tal?
tengo alguna q otra duda en mi devenir en este juego, y una de dos, o las comparto con alguien q me oueda echar una mano, o me quedo sin poder avanzar durante bastante tiempo.
Si alguna se puede permitir la molestia de contestar lo agradecería.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:54.