OVH Cloud OVH Cloud

Problème bizarre

21 réponses
Avatar
JKB
Bonjour à tous,

Je sèche depuis ce matin sur un problème bizarre. Ça doit être
complètement trivial, mais je ne comprend pas. Considérons le code
suivant qui provient d'un analyseur syntaxique que j'ai écrit :

/*
* Test de la présence de l'instruction EXIT dans une boucle
*/

l_element_pile_systeme = (*s_etat_processus).l_base_pile_systeme;
presence_boucle = d_faux;
drapeau_boucle_definie = d_faux;

while((l_element_pile_systeme != NULL) &&
(printf(">%d\n", presence_boucle), presence_boucle == d_faux))
{
printf("Boucle %d\n", presence_boucle);
if ((strcmp((*l_element_pile_systeme).type_cloture, "START") == 0) ||
(strcmp((*l_element_pile_systeme).type_cloture, "FOR") == 0))
{
printf("Là\n");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_vrai;
}
else if ((strcmp((*l_element_pile_systeme).type_cloture, "DO") == 0) ||
(strcmp((*l_element_pile_systeme).type_cloture, "WHILE") == 0))
{
printf("Ici\n");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_faux;
}

printf("<%s> %d\n", (*l_element_pile_systeme).type_cloture, presence_boucle);
l_element_pile_systeme = (*l_element_pile_systeme).suivant;
printf("<> %d\n", presence_boucle);
}

printf("Paf\n");

l_element_pile_systeme est un pointeur sur une structure de liste
chaînée qui contient au moins un champ 'suivant' et un champ statique
(char[6]) type_cloture. Je veux simplement que si la variable
entière presence_boucle devient vrai et qu'on n'est pas encore à la fin
de la liste chaîne, on sorte de la boucle.

Ce code _fonctionnait_. Il est actuellement compilé avec gcc-4.4 -O3
(mais je viens de tester -03 et gcc-4.3). Je ne sais plus avec quelle
configuration ça fonctionnait et je ne vois pas ce que j'aurais changé
depuis...

À l'exécution, ça donne :

>0
Boucle 0
<IF> 0
<> 0
>0
Boucle 0
Ici
<WHILE> 255
<> 255
>255
>0 <-- Je ne comprends pas ÇA...
Boucle 0
<> 0
<> 0
>0
Boucle 0
<> 0
<> 0
Paf

Si quelqu'un avait une idée... Parce que je sèche sur un bout de
code carrément simple et j'ai _honte_...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.

1 réponse

1 2 3
Avatar
JKB
Le 20-10-2009, ? propos de
Re: Problème bizarre,
-ed- ?crivait dans fr.comp.lang.c :
On 19 oct, 17:55, JKB wrote:
> mais pas sûr que ce soit vrai si il y a des affectations dans
> l'expression... Il est possible que ça dépende de l'implémentation,
> d'où un changement de comportement quand tu changes de compilateur.

        Il n'y a _aucune_ affectation dans l'expression, rien du tout. Le
        compilo génère un code assembleur dans certains cas avec
        certaines options de compilation qui proviendrait plus de

        while((l_element_pile_systeme != NULL) && (presence_boucle = d_faux))



Ici, il y a clairement une affectation. Tu veux dire que le code
généré correspond à celui-ci


        que de

        while((l_element_pile_systeme != NULL) && (presence_boucle == d_faux))



alors que tu as codé cela ?

Si c'est le cas, oui, c'est un bug du compilateur.



C'est exactement ça. Et ça ne se produit qu'en fonction des
fonctions C qui précèdent dans le code source.

        Je vais donc clore la discussion qui est plus un problème de compilo
        qu'un problème de C.



OK.



JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
1 2 3