bonjour ,
j'ai vraiment besoin d'aide, je ne m'en sort pas avec mon projet
avez vous une idée du probleme ?

==4941== Invalid write of size 1
==4941== at 0x4026107: strcpy (mc_replace_strmem.c:311)
==4941== by 0x804B8B0: ruleFromString (regle.c:129) / ligne 16 dans le past
==4941== by 0x804EADC: loadRuleBase (persistance.c:212)
==4941== by 0x80492ED: morpionGame (morpion.c:150)
==4941== by 0x804EEAB: main (main.c:37)
==4941== Address 0x46d9842 is 7 bytes after a block of size 3 alloc'd
==4941== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==4941== by 0x804B87F: ruleFromString (regle.c:126)
==4941== by 0x804EADC: loadRuleBase (persistance.c:212)
==4941== by 0x80492ED: morpionGame (morpion.c:150)
==4941== by 0x804EEAB: main (main.c:37)
==4941==
==4941== Invalid read of size 1
==4941== at 0x402665C: strcmp (mc_replace_strmem.c:426)
==4941== by 0x804D556: moteurInfAR (moteur.c:108) // LIGNE 13 dans le past
==4941== by 0x8049950: morpionGame (morpion.c:269)
==4941== by 0x804EEAB: main (main.c:37)
==4941== Address 0x46d983b is 0 bytes after a block of size 3 alloc'd
==4941== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==4941== by 0x804B87F: ruleFromString (regle.c:126)
==4941== by 0x804EADC: loadRuleBase (persistance.c:212)
==4941== by 0x80492ED: morpionGame (morpion.c:150)
==4941== by 0x804EEAB: main (main.c:37)
==4941==
==4941== Invalid read of size 1
==4941== at 0x402665C: strcmp (mc_replace_strmem.c:426)
==4941== by 0x804D556: moteurInfAR (moteur.c:108)
==4941== by 0x8049979: morpionGame (morpion.c:270)
==4941== by 0x804EEAB: main (main.c:37)
==4941== Address 0x46d983b is 0 bytes after a block of size 3 alloc'd
==4941== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==4941== by 0x804B87F: ruleFromString (regle.c:126)
==4941== by 0x804EADC: loadRuleBase (persistance.c:212)
==4941== by 0x80492ED: morpionGame (morpion.c:150)
==4941== by 0x804EEAB: main (main.c:37)
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
short ruleFromString( char* ruleString,Rule* r) {
    char* token = NULL; // Partie de string
    char* hypo = NULL;
    short length;
 
    listInit(&(r->hypo));
    token = strtok(ruleString, " ");
 
    //parcours des hypotheses
    while (token != NULL) {
        length = sizeof(char) * (strlen(token)+1);
        if(strcmp(token,"->")==0) { // Test : fin des hypothèses
            token = strtok(NULL," "); // NULL : prend la derniere chaine de caractères stockée
            if(token==NULL)
                return -1;
            r->concl = malloc((length)); // pb detecte avec valgrind
            if(r->concl == NULL) // Test du malloc
                return -1;
            strcpy(r->concl,token); // pb detecte avec valgrind
            return 1;
        }
        hypo = malloc(length);
        strcpy(hypo, token);
        if(!listPushBack(&(r->hypo),(void*) hypo)) { // Test fonctionnement de listPushBack ?
            listRemoveAll(&(r->hypo)); // Suppression de toutes les hypothèses
            return -1;
        }
        token = strtok(NULL," ");
    }
    return 1;
}
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
short moteurInfAR(List listRules, List listFacts,char *but) {
 
    Rule *rule = NULL;
    char *hypo = NULL;
    short flag_allHypoFound = 0;
    int i = 0;
    int j = 0;
 
    if(elementSearch(listFacts,but) == 1) // Si but est dans les faits
        return 1;
    for (i = 0; i < listLength(listRules); i++) { // Parcours de la liste de règles
            rule = (Rule *) listGetElement(listRules, i);
            if (strcmp (but,rule->concl)== 0) { // Si le but est la conclusion d'une des règles
                flag_allHypoFound = 1;
                for (j = 0; j < listLength(rule->hypo); j++) { // Parcours des hypothèses d'une règle
                    hypo = (char*) listGetElement(rule->hypo, j);
                    if (elementSearch(listFacts, hypo) == 0)//  Si une hypo n'est pas dans la base de faits ,flag_allHypoFound = 0
                        flag_allHypoFound = 0;
                }
                if(flag_allHypoFound) // Si un but est verifié , arrêt du parcourt de la liste regles
                    break;
            }
            else
                flag_allHypoFound = 0;
    }
    return flag_allHypoFound;
}