Probleme lors de l'incrémentation du fonction ( C )

Statut
N'est pas ouverte pour d'autres réponses.

- Lo0

Elite
Bonjour, tout le monde. Je dois faire une programme de sudoku en C pour l'école et donc la premiere étape est de crée une grille complete de sudoku. Pour ca pas de probleme, je procede de la facon la plus élémentaire qui soit, cad je pioche une nombre au hasard et je vérifie qu'il n'a pas d'équivalent dans la ligne, colone ou sous grille, aux quelle cas je repioche un nombre un certain nombre de fois, s'il ne trouve pas, je recommence la grille a 0.

Jusque la pas de probleme, je fait cette partie la dans mon main() et ca marche tres bien. Cependant, je dois crée une fonction pour faire ca, donc pas de probleme, je fait copier / coller en écrivant au dessus

int CreeGrilleSudoku (int tab[][9] );

/*-----------------------------------------------------------------
// DESCRIPTION : Crée une grille de sudoku aléatoire
// IN :
// OUT : tab = le tableau dans le quelle ont écris les valeur de la grille
// RETURN : le nombre d'essais pour créer la grille
//-----------------------------------------------------------------*/
int CreeGrilleSudoku (int tab[][9] )


Je suprime le int tab[][9] qui se retrouve redondant. Et la, pouf, ca marche plus. Il éxécute bien la fonction mais il mouline a l'infini ( en évitant d'éxécuter certain if diront on ). =/
Quelqu'un a pas une idée du probleme ?

Pour info, voici mes deux programme avant et apres, quand ca marche et quand ca marche pas
Aussi : Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ; : crée une matrice avec que des 0 dedans
Affiche_Matrice_i(9, 9, tab ) ; : affiche la matrice

Donc quand ca marche.

Code:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAXESSAIS 50
#include "..\vecteur.h"
#include "..\matrice.h"



main()
{
	int i, j, k, a,b, tab[9][10], redonne = 0, compteur = 1, essais = 0, essais2 = 0 ; // compteur = 1 car si réussi premier coup compte 0x 
	Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
	srand((unsigned) time(NULL) + rand());

	for( i=0 ; i<9 ; i++ )
		for ( j=0; j<9 ; j++ )
		{
			tab[i][j] = rand() % 9 + 1;
			if ( j != 0 )
			for( k = j-1 ; k >= 0 ; k-- ) 
			{
				if (tab[i][k] == tab[i][j] )  // A
				{
					redonne = 1 ;
					k = 0 ;
				}
			}
			// printf("test1") ;
			if (redonne == 0 && i != 0)
			{
			//	printf("test2") ;
				for( k = i-1 ; k >= 0 ; k-- )   // B
				{
					if (tab[k][j] == tab[i][j] )
					{
						redonne = 1 ;
						k = 0 ;			// empeche de calculer pour rien, sort de la boucle
						essais++ ;
					}
				}
			}
			if ( redonne == 0 && ( i!=0 || j!=0 ) )	   // C
				for ( a = i - i%3 ; a < i - i%3 + 3 ; a++ )
					for ( b = j - j%3 ; b < j - j%3 + 3 ; b++ )
					{
						if ( ( a != i || b != j ) && tab[a][b] == tab[i][j]) 
						{
							 redonne = 1 ;
							 essais2++ ;
							 a = 10 ;
							 b = 10 ;
					//		 printf( "test") ;
						}
					}
				//printf("tot") ;



			if(redonne == 1 )
				j-- ;
			//else if( redonne == 3 )
			else if ( redonne == 0 ) 
				essais = 0 ;
			
			redonne = 0 ;
			if ( essais == MAXESSAIS || essais2 == MAXESSAIS )
			{
//				printf("TOTO1") ;
				Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
				essais = 0 ;
				essais2 = 0 ;
				i = -1 ;
				j = -1 ;
				compteur++ ;
			}

		}
		Affiche_Matrice_i(9, 9, tab ) ;
		printf("\n %d ", compteur ) ;
}
Quand ca marche pas

Code:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAXESSAIS 50
#include "D:\Documents and Settings\ggh\Bureau\module\vecteur.h"
#include "D:\Documents and Settings\ggh\Bureau\module\matrice.h"

int CreeGrilleSudoku (int tab[][9] ) ;

/*-----------------------------------------------------------------
// DESCRIPTION : Crée une grille de sudoku aléatoire
// IN  : 
// OUT : tab = le tableau dans le quelle ont écris les valeur de la grille
// RETURN : le nombre d'essais pour créer la grille
//-----------------------------------------------------------------*/

int CreeGrilleSudoku (int tab[][9] )
{
	int i, j, k, a,b,  redonne = 0, compteur = 1, essais = 0, essais2 = 0 ; // compteur = 1 car si réussi premier coup compte 0x 
	Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
	Affiche_Matrice_i(9, 9, tab ) ;
	srand((unsigned) time(NULL) + rand());

	for( i=0 ; i<9 ; i++ )
		for ( j=0; j<9 ; j++ )
		{
			tab[i][j] = rand() % 9 + 1;
			if ( j != 0 )
			for( k = j-1 ; k >= 0 ; k-- ) 
			{
				if (tab[i][k] == tab[i][j] )  // A
				{
					redonne = 1 ;
					k = 0 ;
					printf("testKK" ) ;
				}
			}
			 printf("test1") ;
			if (redonne == 0 && i != 0)
			{
				printf("test2") ;
				for( k = i-1 ; k >= 0 ; k-- )   // B
				{
					if (tab[k][j] == tab[i][j] )
					{
						redonne = 1 ;
						k = 0 ;			// empeche de calculer pour rien, sort de la boucle
						essais++ ;
					}
				}
			}
			if ( redonne == 0 && ( i!=0 || j!=0 ) )	   // C
				for ( a = i - i%3 ; a < i - i%3 + 3 ; a++ )
					for ( b = j - j%3 ; b < j - j%3 + 3 ; b++ )
					{
						if ( ( a != i || b != j ) && tab[a][b] == tab[i][j]) 
						{
							 redonne = 1 ;
							 essais2++ ;
							 a = 10 ;
							 b = 10 ;
							 printf( "test") ;
						}
					}
				printf("tot %d", essais) ;



			if(redonne == 1 )
				j-- ;
			//else if( redonne == 3 )
			else if ( redonne == 0 ) 
				essais = 0 ;
			
			redonne = 0 ;
			if ( essais == MAXESSAIS || essais2 == MAXESSAIS )
			{
				printf("TOTO1") ;
				Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
				essais = 0 ;
				essais2 = 0 ;
				i = -1 ;
				j = -1 ;
				compteur++ ;
			}
			

		}
		Affiche_Matrice_i(9, 9, tab ) ;
			return compteur ;
}



main()
{
	int  tab[9][10], compteur  ;  
	
	compteur = CreeGrilleSudoku( tab ) ;
	Affiche_Matrice_i(9, 9, tab ) ;
	printf("\n %d ",compteur) ;
}
 

Dieu Bisounours

Créateur de Dieu
Après une première lecture très rapide et n'étant pas expert en C, je dirai que c'est peut-etre un problème de passage de variable à la fonction.
Quand tu passes par valeur une variable à une fonction il effectue une copie locale à la fonction de la variable et c'est donc une différente qui arrive dans ta fonction! De plus, lorsque la fonction se termine, cette variable "temporaire" est automatiquement détruite.

Essaye de passer le tableau par référence ( appelfonction(&tableau) ) afin que ca soit sur ton tableau de départ que les changements s'effectuent et non sur un tableau different!

Maintenant je te dis ca car c'est un problème recurrent dans ce genre de programme mais je suis peut-être complètement à côté de la plaque :-D

Enfin dis moi quoi :)
 
1er
OP
- Lo0

- Lo0

Elite
Non apparement ca change rien. Tempis je demanderai demain a la prof
 

.Vinc.

Oh, un LamZ !
Tu fais Prologin2007 ? o_O
 
1er
OP
- Lo0

- Lo0

Elite
RoXioR@LamZ a dit:
Tu fais Prologin2007 ? o_O
Non, parcontre je viens d'aller voir sur leur site, premier exercices ils se plantent deja. 2000 n'est pas une année bisextille ;-D
Puis faut etre francais, non ? J'essayerais bien en fait, mais bon, mes chances sont minces ^^-
 

gogoprog

Oprahiste vaudou
- Lo0 a dit:
Non, parcontre je viens d'aller voir sur leur site, premier exercices ils se plantent deja. 2000 n'est pas une année bisextille ;-D
Puis faut etre francais, non ? J'essayerais bien en fait, mais bon, mes chances sont minces ^^-
Tu peux y aller meme si tu n'es pas francais ;)
J'ai fait celui de 2006, selectionné pour la finale a paris mais j'ai pas été ;)
 

Froggy

fake geek
- Lo0 a dit:
Non, parcontre je viens d'aller voir sur leur site, premier exercices ils se plantent deja. 2000 n'est pas une année bisextille ;-D
hein ? o_O

bien sur que 2000 est une année bissextile :D
 
1er
OP
- Lo0

- Lo0

Elite
Froggy a dit:
hein ? o_O

bien sur que 2000 est une année bissextile :D

;-D:oops:;-D

C'est vrai, je croyais que non parce qu'il y a une subtilité si l'année est divisible par 100 mais pas par 400 elle l'est pas :p

Au fait j'ai trouvé le probleme ( oui bon, ma prof a trouvé ).

Le probleme est que dans le main() je int un tableau 9x9 et dans ma fonction je dois avoir un tableau 10x10. J'ai pas trop compris pourquoi, mais voila, c'etait ca.
 

Liquid Sn@ke

Touriste
tes pas à Gramme à liège par hasard?
 
1er
OP
- Lo0

- Lo0

Elite
Si en 2ieme :)
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut