bonjour à tous,
Je suis en ce moment sur un projet d'IA qui utilise 2 structures:
base de règle et base de faits:
voici mon petit soucis:
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;
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.
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 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"); }
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;
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; }
merci pour vos réponses, si je n'ai pas assez expliqué faite moi part de ce que vous n'avez pas compris.
Partager