Bonjour,

J'aimerais de l'aide sur une gestion de pointeur.
Je dois gerer une equation (avec ses priorité opératoires etc) dans un arbre binaire de façon à pouvoir l'enregistrer, l'affiher et la calculer. Seulement j'ai un problème lors de la création de mon arbre. La boucle If avec "arbrefct->droite" dans ce code ne fonctionne pas (plantage du programme) Le code présenté içi est une partie de la fonction et du programme, mais le message "premier élement ne s'affiche pas alors que ceux d'avant s'affiche. Comment corriger ?

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
 
noeud *creerArbre(char *t)
{
    noeud *s = malloc(sizeof(noeud));
    int i=2,taille=0,nbPOuv=0,nbP=0,tolerance=0; // i initialisé à 2 pour sauté le =
    taille=strlen(t);
 
    s->valeur = t[0]; // implicitement, le caractère est transformé en Code ASCII
    s->oper = "=";  // permet de dire que nous sommes bien dans le premier élement pour la fonction d'affichage
    s->gauche = NULL;
    s->droite = NULL;
 
    //maintenant on doit en fonction des parenthèse établir une hierarchie
    //Utilisation d'une variable de tolérance, permettant de refaire des test de aractères tant que le nombre de parenthèse tolérée <= nombre de parenthèse dans la fonction
    while (tolerance <= nbP)
    {
        while (i<= taille)
        {
            //gestion du nombre de parenthèse
            if (t[i] == '(')
            {
                nbPOuv++;
                nbP++;
            }
 
            if ((t[i] == ')') && (nbPOuv != 0)) // même si ça ne devrait jamais arriver, simple sécurité
                nbPOuv--;
 
            if (((t[i] == '+') || (t[i] == '-') || (t[i] == '*')) && (nbPOuv == tolerance))  //Si t est soit +, soit -, soit * et qu'en plus, le nombre de parenthèse ouverte est identique au nombre de parenthèse tolérée
            {
                printf("Caractère entrant : %c\n",t[i]);
                ajouterNoeud(s,t[i],0);
                //On ajoute à la suite les caractères précedants et suivant celui traité uniquement si on a pas de parenthése aant et après l'opérateur
                if ((estTuUnChiffre(t[i-1])) && (estTuUnChiffre(t[i+1])))
                {
                //Ne pas oublier de faire une conversion en nombre à 2 digits si on le doit
                    if (estTuUnChiffre(t[i-2]))
                        ajouterNoeud(s,nombre(t[i-2],t[i-1]),1);
                    else
                        ajouterNoeud(s,t[i-1],1);
 
                    if (estTuUnChiffre(t[i+2]))
                        ajouterNoeud(s,nombre(t[i+1],t[i+2]),0);
                    else
                        ajouterNoeud(s,t[i+1],0);
                }
            }
            i++;
        }
        //reinitialisation des paramètres
        tolerance++;
        i=2;
    }while (tolerance <= nbP);
 
    return s;
}
 
void ajouterNoeud(noeud **arbre, char valeur, int dir)
{
    noeud *noeudfct;
    noeud *arbrefct = *arbre;
 
    noeud *elem = malloc(sizeof(noeud));
    //Définition de l'élement que l'on ajoute
    if (estTuUnChiffre(valeur))
    {
        elem->valeur = conversionEntier(valeur);
        elem->oper = NULL;
        elem->gauche = NULL;
        elem->droite = NULL;
    }
    else
    {
        elem->valeur = NULL;
        elem->oper = valeur;
        elem->gauche = NULL;
        elem->droite = NULL;
    }
    noeudfct = arbrefct;
    printf("Hey\n");
    //Maintenant, si c'est le premier élement de calcul de l'équation, il viendra forcément se placer à droite, et on aura forcément NULL
    if (arbrefct->droite == NULL)
    {
        printf("Premier élement\n");
        noeudfct->droite = elem;
        return;
    }
Je joins également la structure noeud utilisée, au cas où :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
typedef struct noeud
{
    int valeur;
    char oper;
    struct noeud *gauche;
    struct noeud *droite;
} noeud ;
J'ai déjà essayer de remplacer la condition IF par :

if (arbrefct != NULL && arbrefct->droite == NULL)Et voiçi ce que le debugger me dit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
#0 774015DE ntdll!LdrQueryProcessModuleInformation() (C:\Windows\system32\ntdll.dll:??)
#1 774015DE ntdll!LdrQueryProcessModuleInformation() (C:\Windows\system32\ntdll.dll:??)
#2 773F014E ntdll!LdrFindResource_U() (C:\Windows\system32\ntdll.dll:??)
#3 0028F9CC ?? () (??:??)
#4 004014EA creerArbre(t=0x404070 <_Jv_RegisterClasses+4210800> "A=1+2") (F:\ProjetAA\AlgoA\main.c:70)
#5 00401A35 main() (F:\ProjetAA\AlgoA\main.c:243)
A SAVOIR :

- Le message Hey s'affiche, mais le programme plante avant le message "premier element", preuve que c'est bien la condition qui a un problème.
- Je commence à 2 car cette fonction sert pour ce qui sera après le =/ En gros l'équation est de la forme a=1+(2*(3+6)) et lorsque je fais la création de l'arbre, je crée le premier élement comme forcément le nom de l'équation et pour opérateur =.