OVH Cloud OVH Cloud

(je suis débutant en c) je ne vois d'instruction pour boucler

156 réponses
Avatar
bpascal123
Bjr,sr,
Voici une fonction tr=E8s simple qui r=E9agit comme s'il y avait une
boucle alors qu'en apparence il n'y en a pas :

#include <stdio.h>

void f2(int b);
void f1(int a);

int main(void)
{
f1(30);

return 0;
}

void f1(int a)
{
if( a )
f2( a - 1 );
printf("%d ", a);
}

void f2(int b)
{
printf(" . ");
if(b)
f1( b - 1 );
}

http://www.java2s.com/Code/C/Function/Functioncalleachother.htm

Merci,
Pascal

10 réponses

Avatar
Lucas Levrel
Le 1 décembre 2009, candide a écrit :

> #include <stdio.h>
>
> int main(void){
> int i;
> printf(" %i n", i ) ;
> return 0;
> }


Même si tu donnes ça pour l'exemple, ce code est interdit :



Quelqu'un a-t-il prétendu le contraire ?

--
LL
Avatar
candide
Lucas Levrel a écrit :
Le 1 décembre 2009, candide a écrit :

#include <stdio.h>

int main(void){
int i;
printf(" %i n", i ) ;
return 0;
}



Même si tu donnes ça pour l'exemple, ce code est interdit :



Quelqu'un a-t-il prétendu le contraire ?




Non mais un code qui contient un UB ne peut rien prouver.
Avatar
Jean-Marc Bourguet
candide writes:

Lucas Levrel a écrit :
> Le 1 décembre 2009, candide a écrit :
>
>>> #include <stdio.h>
>>>
>>> int main(void){
>>> int i;
>>> printf(" %i n", i ) ;
>>> return 0;
>>> }
>>
>> Même si tu donnes ça pour l'exemple, ce code est interdit :
>
> Quelqu'un a-t-il prétendu le contraire ?


Non mais un code qui contient un UB ne peut rien prouver.



Si qu'au moins un compilateur le traite d'une maniere donnee. Hors,
l'objectif de Lucas dans le cas present est justement dans cette classe:
montrer que gcc ne traite pas ce cas en initialisant systematiquement les
variables a 0.

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Antoine Leca
Wykaaa écrit dans <news:4b142454$0$914$ :
Antoine Leca a écrit :
[ Copie et suivis sur fr.comp.mail ]





Ouais, en tous cas c'était l'intention :^) Mais bon, quand on ne sait
pas lire le français, on confond « Répondre à » et « Suivis vers » :o|


Question subsidiaire : quelle extension (ou quel paramétrage) pour que
Tbird réagisse correctement aux URLs <news:, à la RFC1738 §3.6 ?



Ah oui, moi aussi je veux savoir.



J'ai trouvé http://messageidfinder.mozdev.org.
Il n'est plus maintenu depuis 4 ans et donc ne fonctionne pas *tel quel*
avec TB 2.0 :-( il faut donc bidouiller le install.rdf <em:maxVersion>
Mais sinon il semble fonctionner.

Il faut maintenant que je remette en place mon infrastructure de
comptes, on dirait que mes essais l'ont passablement affectée,
TB n'arrête pas de me demander de renseigner un nouveau compte nommé
"news". Défaut connu ?


Antoine
Avatar
candide
Jean-Marc Bourguet a écrit :

Si qu'au moins un compilateur le traite d'une maniere donnee. Hors,
l'objectif de Lucas dans le cas present est justement dans cette classe:
montrer que gcc ne traite pas ce cas en initialisant systematiquement les
variables a 0.




OK donc on finalement on reproche à gcc en initialisant à 0 d'empêcher
de détecter l'UB puisque probablement le code planterait avec une
initialisation à -1208656032.
Avatar
Jean-Marc Bourguet
candide writes:

Jean-Marc Bourguet a écrit :

Si qu'au moins un compilateur le traite d'une maniere donnee. Hors,
l'objectif de Lucas dans le cas present est justement dans cette classe:
montrer que gcc ne traite pas ce cas en initialisant systematiquement les
variables a 0.




OK donc on finalement on reproche à gcc en initialisant à 0 d'empêcher de
détecter l'UB puisque probablement le code planterait avec une
initialisation à -1208656032.



Marc a fait ce reproche à gcc, Lucas a montré que ce n'était pas
(toujours?) le cas.

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
espie
In article ,
Jean-Marc Bourguet wrote:
candide writes:

Lucas Levrel a écrit :
> Le 1 décembre 2009, candide a écrit :
>
>>> #include <stdio.h>
>>>
>>> int main(void){
>>> int i;
>>> printf(" %i n", i ) ;
>>> return 0;
>>> }
>>
>> Même si tu donnes ça pour l'exemple, ce code est interdit :
>
> Quelqu'un a-t-il prétendu le contraire ?


Non mais un code qui contient un UB ne peut rien prouver.



Si qu'au moins un compilateur le traite d'une maniere donnee. Hors,
l'objectif de Lucas dans le cas present est justement dans cette classe:
montrer que gcc ne traite pas ce cas en initialisant systematiquement les
variables a 0.



Que je sache, je ne crois pas avoir dit que c'etait systematique.

C'est un comportement tres courant sur au moins certaines version de gcc.

Il est possible qu'ils aient finalement corrige le probleme, mais en tout
cas, ca a pose souci a un certain nombre de gens pendant un certain nombre
de generations.

... et ca ne change rien au fait qu'a la base, c'est une idee debile.
Avatar
espie
In article <4b154ff3$0$2040$,
candide wrote:
Jean-Marc Bourguet a écrit :

Si qu'au moins un compilateur le traite d'une maniere donnee. Hors,
l'objectif de Lucas dans le cas present est justement dans cette classe:
montrer que gcc ne traite pas ce cas en initialisant systematiquement les
variables a 0.




OK donc on finalement on reproche à gcc en initialisant à 0 d'empêcher
de détecter l'UB puisque probablement le code planterait avec une
initialisation à -1208656032.



Il y a deux sortes de gens par ici: ceux qui programment, et ceux qui sont
la juste pour chercher la petite bete. Tu trouverais sans doute plus ton
bonheur sur comp.lang.std.c...
Avatar
Jean-Marc Bourguet
(Marc Espie) writes:

... et ca ne change rien au fait qu'a la base, c'est une idee debile.



Je suis d'accord que c'est une idée débile. Je suis beaucoup moins certain
que gcc l'ai jamais fait; je ne l'ai jamais observé et un petit essai me
montre que sur les versions que j'ai ici, ça ne se passe pas (l'appel à f
est là pour essayer diminuer les chances d'un 0 présent par hasard):

$ cat testinit.c
#include <stdio.h>

void f()
{
int i = 42;
printf("%pn", &i);
}

void g()
{
int i;
printf("%dn", i);
}

int main()
{
f();
g();
return 0;
}
$ for c in 2.95 3.2 3.3 3.4 4.0 4.1 4.2 4.3 4.4 ; do
gcc-$c -g testinit.c
./a.out
done


0xbfa89334
42
0xbf96a214
42
0xbfe9bf44
42
0xbfb203b4
42
0xbfdf5e84
42
0xbfe2e6c4
42
0xbfead744
42
0xbfdb2e44
42
0xbfbafc4c
42

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
candide
Marc Espie a écrit :

Il y a deux sortes de gens par ici: ceux qui programment, et ceux qui sont
la juste pour chercher la petite bete. Tu trouverais sans doute plus ton
bonheur sur comp.lang.std.c...




Non, justement pas lang mais comp.std.c ;)

Tu as raison, la programmation en C au sens du travail d'un programmeur
ne m'intéresse pas plus que ça, pour l'instant en tous cas. Ce qui
m'intéresse c'est pas de chercher la petite bête mais réfléchir à des
moyens plus efficaces d'apprendre le C (ou d'autres langages), qu'on
s'adresse à des débutants ou à des programmeurs ayant déjà une certaine
expérience. Je me réfère à la Norme parce qu'elle propose en général des
informations beaucoup plus précises voire plus cohérentes, lisibles et
didactiques que la majorité des sources d'information.

Et si tu m'/nous expliquais plutôt pourquoi il est tellement scandaleux
d'initialiser par défaut à zéro les variables automatiques ?