Le 16-10-2009, ? propos de
Problème bizarre,
Encore plus incompréhensible :
Le 16-10-2009, ? propos de
Problème bizarre,
Encore plus incompréhensible :
Le 16-10-2009, ? propos de
Problème bizarre,
Encore plus incompréhensible :
Le 16-10-2009, ? propos de
Re: Problème bizarre,
JKB ?crivait dans fr.comp.lang.c :Le 16-10-2009, ? propos de
Problème bizarre,
Encore plus incompréhensible :
En exécutant le code précédent en pas à pas sous gdb, ça marche ! Je
ne comprends plus du tout...
JKB
Le 16-10-2009, ? propos de
Re: Problème bizarre,
JKB ?crivait dans fr.comp.lang.c :
Le 16-10-2009, ? propos de
Problème bizarre,
Encore plus incompréhensible :
En exécutant le code précédent en pas à pas sous gdb, ça marche ! Je
ne comprends plus du tout...
JKB
Le 16-10-2009, ? propos de
Re: Problème bizarre,
JKB ?crivait dans fr.comp.lang.c :Le 16-10-2009, ? propos de
Problème bizarre,
Encore plus incompréhensible :
En exécutant le code précédent en pas à pas sous gdb, ça marche ! Je
ne comprends plus du tout...
JKB
Le Fri, 16 Oct 2009 13:06:01 +0000 (UTC)
JKB a écritLe 16-10-2009, ? propos de
Re: Problème bizarre,
JKB ?crivait dans fr.comp.lang.c :Le 16-10-2009, ? propos de
Problème bizarre,
Encore plus incompréhensible :
En exécutant le code précédent en pas à pas sous gdb, ça marche ! Je
ne comprends plus du tout...
JKB
Au contraire ce fait est très intéressant, maintenant on sait que le
pb ce situe au niveau de la structure de données.
Ce qui peut arriver c'est un débordement qui ne seproduit pas en
debug, ou alors un pb d'alignement dans le struct (par exemple un flag
à l'intérieur même de la structure, compilé différemment entre release
et debug).
Ca donne au moins des directions dans lesquelles regarder.
Le Fri, 16 Oct 2009 13:06:01 +0000 (UTC)
JKB a écrit
Le 16-10-2009, ? propos de
Re: Problème bizarre,
JKB ?crivait dans fr.comp.lang.c :
Le 16-10-2009, ? propos de
Problème bizarre,
Encore plus incompréhensible :
En exécutant le code précédent en pas à pas sous gdb, ça marche ! Je
ne comprends plus du tout...
JKB
Au contraire ce fait est très intéressant, maintenant on sait que le
pb ce situe au niveau de la structure de données.
Ce qui peut arriver c'est un débordement qui ne seproduit pas en
debug, ou alors un pb d'alignement dans le struct (par exemple un flag
à l'intérieur même de la structure, compilé différemment entre release
et debug).
Ca donne au moins des directions dans lesquelles regarder.
Le Fri, 16 Oct 2009 13:06:01 +0000 (UTC)
JKB a écritLe 16-10-2009, ? propos de
Re: Problème bizarre,
JKB ?crivait dans fr.comp.lang.c :Le 16-10-2009, ? propos de
Problème bizarre,
Encore plus incompréhensible :
En exécutant le code précédent en pas à pas sous gdb, ça marche ! Je
ne comprends plus du tout...
JKB
Au contraire ce fait est très intéressant, maintenant on sait que le
pb ce situe au niveau de la structure de données.
Ce qui peut arriver c'est un débordement qui ne seproduit pas en
debug, ou alors un pb d'alignement dans le struct (par exemple un flag
à l'intérieur même de la structure, compilé différemment entre release
et debug).
Ca donne au moins des directions dans lesquelles regarder.
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_system e;
presence_boucle = d_faux;
drapeau_boucle_definie = d_faux;
while((l_element_pile_systeme != NULL) &&
(printf(">%dn", presence _boucle), presence_boucle == d_faux))
{
printf("Boucle %dn", presence_boucle);
if ((strcmp((*l_element_pile_systeme).type_cloture, "STAR T") == 0) ||
(strcmp((*l_element_pile_systeme).type_cl oture, "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_cl oture, "WHILE") == 0))
{
printf("Icin");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_faux;
}
printf("<%s> %dn", (*l_element_pile_systeme).type_cloture, presence_bouc le);
l_element_pile_systeme = (*l_element_pile_systeme).suiv ant;
printf("<> %dn", presence_boucle);
}
printf("Pafn");
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 f in
de la liste chaîne, on sorte de la boucle.
Ce code _fonctionnait_. Il est actuellement compilé ave c 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.
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_system e;
presence_boucle = d_faux;
drapeau_boucle_definie = d_faux;
while((l_element_pile_systeme != NULL) &&
(printf(">%dn", presence _boucle), presence_boucle == d_faux))
{
printf("Boucle %dn", presence_boucle);
if ((strcmp((*l_element_pile_systeme).type_cloture, "STAR T") == 0) ||
(strcmp((*l_element_pile_systeme).type_cl oture, "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_cl oture, "WHILE") == 0))
{
printf("Icin");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_faux;
}
printf("<%s> %dn", (*l_element_pile_systeme).type_cloture, presence_bouc le);
l_element_pile_systeme = (*l_element_pile_systeme).suiv ant;
printf("<> %dn", presence_boucle);
}
printf("Pafn");
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 f in
de la liste chaîne, on sorte de la boucle.
Ce code _fonctionnait_. Il est actuellement compilé ave c 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.
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_system e;
presence_boucle = d_faux;
drapeau_boucle_definie = d_faux;
while((l_element_pile_systeme != NULL) &&
(printf(">%dn", presence _boucle), presence_boucle == d_faux))
{
printf("Boucle %dn", presence_boucle);
if ((strcmp((*l_element_pile_systeme).type_cloture, "STAR T") == 0) ||
(strcmp((*l_element_pile_systeme).type_cl oture, "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_cl oture, "WHILE") == 0))
{
printf("Icin");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_faux;
}
printf("<%s> %dn", (*l_element_pile_systeme).type_cloture, presence_bouc le);
l_element_pile_systeme = (*l_element_pile_systeme).suiv ant;
printf("<> %dn", presence_boucle);
}
printf("Pafn");
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 f in
de la liste chaîne, on sorte de la boucle.
Ce code _fonctionnait_. Il est actuellement compilé ave c 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.
Sans doute un pb memoire, plutot que gdb, utilise
un outil comme valgrind, ou bien donne un code
complet. Par ailleurs, ton test sur printf me semble
un peu superflu...
2<
2<
Sans doute un pb memoire, plutot que gdb, utilise
un outil comme valgrind, ou bien donne un code
complet. Par ailleurs, ton test sur printf me semble
un peu superflu...
2<
2<
Sans doute un pb memoire, plutot que gdb, utilise
un outil comme valgrind, ou bien donne un code
complet. Par ailleurs, ton test sur printf me semble
un peu superflu...
2<
2<
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
warning: Source file is more recent than executable.
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
warning: Source file is more recent than executable.
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
warning: Source file is more recent than executable.
while((l_element_pile_systeme != NULL) &&
(printf(">%dn", presence_boucle), presence_boucle == d_faux))
while((l_element_pile_systeme != NULL) &&(presence_boucle == d_faux))
while((l_element_pile_systeme != NULL) &&
(printf(">%dn", presence_boucle), presence_boucle == d_faux))
while((l_element_pile_systeme != NULL) &&(presence_boucle == d_faux))
while((l_element_pile_systeme != NULL) &&
(printf(">%dn", presence_boucle), presence_boucle == d_faux))
while((l_element_pile_systeme != NULL) &&(presence_boucle == d_faux))
Le Sat, 17 Oct 2009 09:21:52 +0000 (UTC)
JKB a écritBreakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
warning: Source file is more recent than executable.
Ceci n'est pas anodin, je pense...
Ce que tu debuggues et ce que tu executes n'est pas la même chose.
(d'ailleurs le source de ton premier post ne correspond pas à ce qu'on
voie dans la session gdb).
Cela dit il n'y a rien dans ce que tu as posté qui permet de conclure
et je crois pas que l'erreur soit là, tu te focalises trop sur la
partie qui a plante, alors que le problème peut-être très loin
ailleurs.
Je continue à penser qu'il y a un soucis dans tes déclarations, en
particulier l'affectation suivante est-elle correcte, les structures
sont-elles compatibles.
l_element_pile_systeme = (*s_etat_processus).l_base_pile_systeme;
S'il y a un UB quelque part ça peut se manifester de manière étrange
ailleurs, en particulier dans un bout de code censé être parfait.
D'autre part pourquoi ces (*liste).champ, et pas liste ->champ ?
C'est lourd à relire.
Enfin es-tu certain que les strcmp ne débordent pas ?
Un memcpy de type_cloture dans un char[40] par exemple, en début de
boucle permettrait de savoir si le est-bien présent en 6 eme
position.
Si tu veux de l'aide (bien que fclc ne soit pas un forum de debug
collectif...) poste au moins un fichier .c autonome (déclarations +
code qui reproduit le pb).
Si ça se trouve rien qu'en essayant de faire ça, tu trouveras ton pb.
Le Sat, 17 Oct 2009 09:21:52 +0000 (UTC)
JKB a écrit
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
warning: Source file is more recent than executable.
Ceci n'est pas anodin, je pense...
Ce que tu debuggues et ce que tu executes n'est pas la même chose.
(d'ailleurs le source de ton premier post ne correspond pas à ce qu'on
voie dans la session gdb).
Cela dit il n'y a rien dans ce que tu as posté qui permet de conclure
et je crois pas que l'erreur soit là, tu te focalises trop sur la
partie qui a plante, alors que le problème peut-être très loin
ailleurs.
Je continue à penser qu'il y a un soucis dans tes déclarations, en
particulier l'affectation suivante est-elle correcte, les structures
sont-elles compatibles.
l_element_pile_systeme = (*s_etat_processus).l_base_pile_systeme;
S'il y a un UB quelque part ça peut se manifester de manière étrange
ailleurs, en particulier dans un bout de code censé être parfait.
D'autre part pourquoi ces (*liste).champ, et pas liste ->champ ?
C'est lourd à relire.
Enfin es-tu certain que les strcmp ne débordent pas ?
Un memcpy de type_cloture dans un char[40] par exemple, en début de
boucle permettrait de savoir si le est-bien présent en 6 eme
position.
Si tu veux de l'aide (bien que fclc ne soit pas un forum de debug
collectif...) poste au moins un fichier .c autonome (déclarations +
code qui reproduit le pb).
Si ça se trouve rien qu'en essayant de faire ça, tu trouveras ton pb.
Le Sat, 17 Oct 2009 09:21:52 +0000 (UTC)
JKB a écritBreakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
warning: Source file is more recent than executable.
Ceci n'est pas anodin, je pense...
Ce que tu debuggues et ce que tu executes n'est pas la même chose.
(d'ailleurs le source de ton premier post ne correspond pas à ce qu'on
voie dans la session gdb).
Cela dit il n'y a rien dans ce que tu as posté qui permet de conclure
et je crois pas que l'erreur soit là, tu te focalises trop sur la
partie qui a plante, alors que le problème peut-être très loin
ailleurs.
Je continue à penser qu'il y a un soucis dans tes déclarations, en
particulier l'affectation suivante est-elle correcte, les structures
sont-elles compatibles.
l_element_pile_systeme = (*s_etat_processus).l_base_pile_systeme;
S'il y a un UB quelque part ça peut se manifester de manière étrange
ailleurs, en particulier dans un bout de code censé être parfait.
D'autre part pourquoi ces (*liste).champ, et pas liste ->champ ?
C'est lourd à relire.
Enfin es-tu certain que les strcmp ne débordent pas ?
Un memcpy de type_cloture dans un char[40] par exemple, en début de
boucle permettrait de savoir si le est-bien présent en 6 eme
position.
Si tu veux de l'aide (bien que fclc ne soit pas un forum de debug
collectif...) poste au moins un fichier .c autonome (déclarations +
code qui reproduit le pb).
Si ça se trouve rien qu'en essayant de faire ça, tu trouveras ton pb.
Le Fri, 16 Oct 2009 11:59:29 +0000 (UTC)
JKB a écritwhile((l_element_pile_systeme != NULL) &&
(printf(">%dn", presence_boucle), presence_boucle == d_faux))
Par ailleurs comme l'a fait remarquer Michko, le printf à l'intérieur
du while est ambigu.
Es-tu sûr que c'est bien presence_boucle == d_faux qui est évalué par
le while et pas la valeur de retour de printf toujours vraie et qui te
conduit à ne jamais sortir de la boucle ?
A-t'on le même résultat avec ça (j'espère parce que sinon, on a
cherché pour rien...) ?while((l_element_pile_systeme != NULL) &&(presence_boucle == d_faux))
Le Fri, 16 Oct 2009 11:59:29 +0000 (UTC)
JKB a écrit
while((l_element_pile_systeme != NULL) &&
(printf(">%dn", presence_boucle), presence_boucle == d_faux))
Par ailleurs comme l'a fait remarquer Michko, le printf à l'intérieur
du while est ambigu.
Es-tu sûr que c'est bien presence_boucle == d_faux qui est évalué par
le while et pas la valeur de retour de printf toujours vraie et qui te
conduit à ne jamais sortir de la boucle ?
A-t'on le même résultat avec ça (j'espère parce que sinon, on a
cherché pour rien...) ?
while((l_element_pile_systeme != NULL) &&(presence_boucle == d_faux))
Le Fri, 16 Oct 2009 11:59:29 +0000 (UTC)
JKB a écritwhile((l_element_pile_systeme != NULL) &&
(printf(">%dn", presence_boucle), presence_boucle == d_faux))
Par ailleurs comme l'a fait remarquer Michko, le printf à l'intérieur
du while est ambigu.
Es-tu sûr que c'est bien presence_boucle == d_faux qui est évalué par
le while et pas la valeur de retour de printf toujours vraie et qui te
conduit à ne jamais sortir de la boucle ?
A-t'on le même résultat avec ça (j'espère parce que sinon, on a
cherché pour rien...) ?while((l_element_pile_systeme != NULL) &&(presence_boucle == d_faux))