bonjour à tous,
Je suis en ce moment sur un projet d'IA qui utilise 2 structures:
base de règle et base de faits:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct BDF
{
	char nom_du_fait [20];
	struct BDF *suiv;
 
}ST_BDF;
 
 
typedef struct BDR
{
	char nom_poisson[15];
	struct BDR *suiv;
	ST_BDF *fait;
}ST_BDR;
voici mon petit soucis:
je commence par créer une règle, tout se passe bien à l'affichage.
je créer des fait, pareil pas de soucis .
mon proble intervient dans la fonction qui vient faire le chainage avant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void test(ST_BDR *r_tete, ST_BDF *f_tete)
{
	ST_BDR *r_courant;
	ST_BDF *f_courant;
	r_courant=r_tete;
	f_courant=f_tete;
	int trouve=0;
	do
	{
		trouve=comparif(r_courant,f_tete);	/*le pb intervien dans cette fonction*/
		if (trouve==1)
		{
			f_tete=insertnouvofait(f_tete,r_courant);
			printf("\nconclusion:%s",r_courant->nom_poisson);
		}
		r_courant=r_courant->suiv;
	}while(r_courant!=NULL);
	printf("\ntoutes les règles ont été parcourues\n");
}
voici la fonction de comparatif:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int comparif(ST_BDR *r_courant, ST_BDF *f_tete)
{
	ST_BDF*f_courant=f_tete;
	ST_BDR*regle=r_courant;
	int trouve=0;
	int ok=0;
	do
	{
		ok=0;
		regle=r_courant;
		do
		{
			if((strcmp(regle->fait->nom_du_fait,f_courant->nom_du_fait))==0)
			{
				ok=1;
			}
			else
			{
				ok=0;
				f_courant=f_courant->suiv;/*pas de modif dans f_tete*/
			}
		}while( f_courant!=NULL && ok==0);
		if (ok==0)
		{
			return 0;
		}
 
		f_courant=f_tete;
		regle->fait=regle->fait->suiv;/*le pb est localisé ici, il modifie mon paramètre r_courant que je passe à la fonction*/
	}while(regle->fait!=NULL);
	regle=r_courant;
	return 1;
}
comme je l'ai indiqué, lorsque j'effecture cette instruction ma variable r_courant est elle aussi modifiée. je ne comprend pas pourquoi (vérifier en débug et lors de l'affichage de la base de règle). f_tete(correspondant à ma base de fait n'est pas modifié) lors f_courant=f_courant->suiv;

merci pour vos réponses, si je n'ai pas assez expliqué faite moi part de ce que vous n'avez pas compris.