Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[débutant] 1er programme, j'aimerais vos commentaires.

91 réponses
Avatar
Beware
Bonjour,

D=E9butant dans l'apprentissage du langage C, j'ai cr=E9e un petit
programme, un jeu du pendu. Le jeu =E0 l'air de fonctionner. Je dis
"l'air de", car il est probable qu'il reste des bugs que je dois
corriger.
Cependant ce n'est pas l'objet de ma question. En effet, dans un souci
de m'am=E9liorer je d=E9sirerais avoir les commentaires de personnes
connaissant et maitrisant mieux le langage C que moi.

Les fichiers du programme (main.c, pendu.h et dico.txt) sont
disponible ici :
http://beware007.free.fr/Projet_C/Pendu/


Merci d'avance pour votre aide, vos commentaire et critiques.

10 réponses

1 2 3 4 5
Avatar
Eric Levenez
Le 13/03/09 18:06, dans
,
« Beware » a écrit :

En effet, dans un souci
de m'améliorer je désirerais avoir les commentaires de personnes
connaissant et maitrisant mieux le langage C que moi.



Je suis très surpris.

En effet souvent les programmes de ce type, postés pour commentaire sont
immondes, mais là tout à l'air bien fait, beaucoup de recommandations ont
été suivis. Bref pas grand chose à dire, à par que c'est vraiment très bien.

Dans les petites choses que j'ai vu, il y a le formatage du code source qui
n'est pas ce j'aime lire, mais là c'est du subjectif et il y a autant
d'écoles que de programmeurs :-)

Il y a une chose étrange qui est la gestion des n. Il est de tradition de
faire printf("hello worldn") et non printf("nhello world"), car sans un
fflush(stdout), rien ne garanti que le second message soit affiché. Voir FAQ
§14.6.

Il manque un test sur les fgets. Pour voir le problème que cela fait, il
suffit de taper Ctrl-D pour que le programme boucle sans fin. Idem si on
lance le programme en ayant fermé stdin (<&- sous shell unix), je sais c'est
chercher la petite bête, mais parfois cela arrive.

Dernière chose, à la compilation, j'ai :

main.c: In function Œmain¹:
main.c:69: warning: comparison between signed and unsigned
main.c: In function Œtest_lettre¹:
main.c:176: warning: comparison between signed and unsigned
main.c: In function Œnouveau_motSecret¹:
main.c:451: warning: comparison between signed and unsigned

Il conviendrait de corriger ces warnings qui peuvent masquer des problèmes
car size_t est non signé et cela peut entraîner des problèmes dans d'autres
programmes.

--
Éric Lévénez
FAQ de fclc : <http://www.levenez.com/lang/c/faq/>
Avatar
espie
In article ,
Beware wrote:
Bonjour,

Débutant dans l'apprentissage du langage C, j'ai crée un petit
programme, un jeu du pendu. Le jeu à l'air de fonctionner. Je dis
"l'air de", car il est probable qu'il reste des bugs que je dois
corriger.
Cependant ce n'est pas l'objet de ma question. En effet, dans un souci
de m'améliorer je désirerais avoir les commentaires de personnes
connaissant et maitrisant mieux le langage C que moi.

Les fichiers du programme (main.c, pendu.h et dico.txt) sont
disponible ici :
http://beware007.free.fr/Projet_C/Pendu/


Merci d'avance pour votre aide, vos commentaire et critiques.



- Tes fonctions sont trop longues, tu peux decouper plus.
Typiquement, ca se voit bien dans la fonction main(), ou tu
initialises 3 tonnes de variables qui ne te servent pas,
puis passe sur une boucle qui reinitialise les memes variables:
une bonne partie de la boucle devrait etre dans d'autres fonctions.

Autre exemple: ce bloc de code

/* Creation du tableau qui va permettre l'affichage */
/* du mot joue par le joueur. */
motJoue = malloc(strlen(motSecret));
if (motJoue == NULL)
exit(0);

while (indice_tableau < strlen(motSecret)) {
motJoue[indice_tableau] = '*';
indice_tableau++;
}
motJoue[indice_tableau] = '';

est un bon candidat a une fonction.


- Il y a des commentaires inutiles, je pense en particulier a
/* Declaration des variables */
ou le tres inutile:
/* on retourne le choix du joueur */
return (choix_rejouer);

Regle d'or: un commentaire a une valeur ajoutee. Si tu paraphrases
ce que fait le code, sans explication supplementaire, un commentaire
ne sert a rien !



- as-tu vu les struct ? tu ne t'en sers pas.

- c'est dommage de limiter les mots possibles a 10 caracteres, ca me
parait un peu arbitraire.

- donner des noms de variable significatifs, c'est bien. Insister sur
indice_tableau (qui n'est absolument pas descriptif) au lieu du conventionnel
i, ca n'apporte rien. Par contre, il faut refaire une passe sur les noms.
Certains ne sont absolument pas clairs, a mon avis. Typiquement, motSecret
et motJoue (c'est du pendu, on ne joue pas un mot mais des lettres).

- les regles du pendu ne sont pas respectees: on n'enleve un coup a jouer
QUE si la lettre proposee ne fait pas partie du mot.

- la fonction affichage n'est pas bonne, voire tres mauvaise, puisque c'est
juste 4 fonctions distinctes regroupees derriere un switch.
Ces fonctions n'utilisent meme pas les memes parametres.

- attention a l'utilisation de fgets() avec un tampon... ca ne marche pas
du tout comme tu penses. le fgets(saisie, sizeof(saisie), stdin) va te
peter a la gueule, surtout avec un tableau de 4 caracteres.
(fgets lit une ligne complete, ou jusqu'a remplir le tableau... elle
ne lit PAS le reste de la ligne... donc si je tape:
34123131311
sur mon clavier, ben je vais me retrouver avec 341 dans mon tampon... et
13131311 en attente sur mon entree standard.
l'utilisation de fgets "propre" est compliquee... :(

- attention aux entrees-sorties sur lignes non completes. printf ne
fonctionne de maniere correcte et garantie QUE si tu affiches une
ligne complete, sinon il peut garder les choses en memoire.
Il faut utiliser setbuf pour changer le mode de tampon, ou fflush
pour etre sur d'afficher avant une entree.
Ton programme marche peut-etre par accident (il y a pas mal de systemes
qui font aussi du C++, et donc qui "attachent" stdin et stdout ensemble),
mais il n'y a rien de garanti.

- dans les trucs anecdotiques,
#endif // PENDU_H_INCLUDED
peut poser des soucis. Il faut que tu aies un preprocesseur recent pour
que ca marche, les commentaires en // sont issus du C++. Ils sont reconnus
en C maintenant, mais parfois, le preprocesseur n'a pas suivi.


Il y aurait sans doute d'autres choses a dire.

- il y a quelques lourdeurs algorithmiques. Lorsque tu regardes le mot
en cours pour y trouver la lettre jouee... ben tu vois combien d'instances
tu en trouves: tu ne devrais pas avoir a compter les etoiles restantes,
parce que c'est quelque chose que tu peux garder en memoire.
Pareil pour le fichier de mots possibles, tu ne devrais pas avoir a le
relire totalement pour savoir combien il contient de mots.

- les parentheses de:
((etat_rejouer == REJOUER_MENU) || (etat_rejouer == REJOUER_NORMAL))
sont inutiles.

- le style est plutot pas mal, mais pas completement coherent. Tu mets
parfois des espaces dans printf, parfois non. Il y a deux trois endroits
ou il y a deux espaces au lieu d'un, parfois tu ecris while(), d'autre
fois while ()


Il y aurait sans doute d'autres choses a dire. C'est une critique un
peu severe, j'ai vu bien des codes de debutants qui etaient incroyablement
plus moches. Persevere, tu es sur la bonne voie.
Avatar
espie
In article <C5E0651E.E44F5%,
Eric Levenez wrote:
main.c: In function Œmain¹:
main.c:69: warning: comparison between signed and unsigned
main.c: In function Œtest_lettre¹:
main.c:176: warning: comparison between signed and unsigned
main.c: In function Œnouveau_motSecret¹:
main.c:451: warning: comparison between signed and unsigned

Il conviendrait de corriger ces warnings qui peuvent masquer des problèmes
car size_t est non signé et cela peut entraîner des problèmes dans d'autres
programmes.



J'ai vu moi-aussi ces avertissements, je ne suis pas sur que les corriger
soit une excellente chose. Ici, c'est tout betement lie a des:
if (indice_tableau < strlen(motSecret))

et donc, pour corriger, il faudrait qu'il redeclare son indice en size_t...
ce qui necessite de maitriser convenablement le travail avec les nombres
non signes, ce qui occasionne souvent plus d'emmerdes que de solutions.
Avatar
Antoine Leca
Le 13/03/2009 17:06, Beware écrivit :
Débutant dans l'apprentissage du langage C, j'ai crée un petit
programme, un jeu du pendu. Le jeu à l'air de fonctionner. Je dis
"l'air de", car il est probable qu'il reste des bugs que je dois
corriger.



C'est bien possible.

Cependant ce n'est pas l'objet de ma question. En effet, dans un souci
de m'améliorer je désirerais avoir les commentaires de personnes
connaissant et maitrisant mieux le langage C que moi.



D'abord, c'est globalement bon.


Mais bien sûr, on peut trouver des commentaires à faire. Par exemple :

Le source devrait s'appeler pendu.c

int nb_coup_restant = 0;
int nb_coup_joue = 0;
int nb_coup_max = 0;
Vous allez dire que je suis vieux jeu, mais en français, le qualifiant
d'un compteur doit être au pluriel; donc on préférera nb_coups_restants,
etc.
Avec nb_coup_restant, il est possible d'hésiter entre un compteur et un
indice dont le premier terme serait impropre.

char lettre;
Un variable de type char est le plus souvent mal typée. En C, une
constante caractère (comme 'a') a pour type int, et ce devrait être le
cas pour les variables qui contiennent des choses similaires. Il y a de
très bonnes raisons (en particulier de pouvoir coder EOF, et de ne pas
perdre bêtement les caractères accentués pour des questions de signe)
pour cela, et le fait d'utiliser char n'a aucun intérêt pratique (cela
ne gagne rien).

/* Le jeu se deroule tant que le joueur veut rejouer */
do {
...
else if (choix_menu == 3) {
affichage(...);
return (0);
...
}
while((etat_rejouer == REJOUER_MENU) ...
return 0;

Cette boucle est beaucoup trop longue. De plus, la logique de sortie est
trop complexe, c'est en partie lié à l'existence de deux variables,
etat_rejouer et choix_menu. En fait, le return(0) est assez horrible,
c'est un saut déguisé, qui montre un problème de conception général de
l'algorithme qui n'a pas été assez poussée.

affichage(AFF_xxx, nb_coup_joue, motSecret, etat_rejouer);
Vu le nombre de fois où cette ligne de code intervient, les trois
variables nb_coup_joue, motSecret et etat_rejouer devrait avoir un
statut plus large, soit tu en fais des variables globales (méthode
ancienne), soit tu les places dans une structure décrivant l'état du jeu
et tu passes un pointeur vers cette structure entre les fonctions
(méthode préférée aujourd'hui, « parce que cela permet le multitâches et
le code ré-entrant ».

/* Affichage du menu global : */
/* Ce menu permet de : */
/* 1 - lancer le jeu */
/* 2 - ajouter un nouveau mot mystere a la liste disponible */
/* 3 - quitter */
Ce commentaire devrait apparaître devant la fonction et dans le fichier
.h, pas là où elle appelée.

choix_menu = affichage(AFF_GENERAL, nb_coup_joue, ...
Autre utilisation très discutable : la fonction affichage renvoit une
valeur qui n'est jamais utilisée sauf cette fois-là ; je sais bien que
cela fait partie des caractéristiques du C, mais ce n'est pas forcément
la meilleure chose à copier ! Soit tu sépares cet appel avec une autre
fonction, soit tu contrôles à chaque fois les valeurs retournées.
Après avoir reçu choix_menu, la forme classique est d'utiliser la
construction switch(){}

motJoue = malloc(strlen(motSecret));
En dehors de la valeur de l'argument (cf. ta première remarque), il faut
utiliser sizeof plutôt que strlen() ici, et calloc() plutôt que
malloc(); voire allouer motJoue en même temps et de la même manière que
motSecret,
char motJoue[TAILLE_MOT_MAX] = "",
motSecret[TAILLE_MOT_MAX] = "";

if (motJoue == NULL)
exit(0);
Pourquoi ?

while (motJoue[indice_tableau] != '') {
printf(" %c", motJoue[indice_tableau]);
indice_tableau++;
}
En C, cela s'écrit
printf(" %s", motJoue);


char saisie[5];
...
fgets(saisie, sizeof saisie, stdin);
ret = sscanf(saisie, "%c", &lettre_joue);
Beaucoup de choses ici. La valeur de fgets() n'est pas contrôlée (toute
opération d'ES, systématiquement, doit être contrôlée). Tu n'indiques
pas à l'utilisateur qu'il devra taper sur Entrée, ce n'est pas évident
dans le contexte. Permettre 4 caractères est une intéressante initiative
(en effet, des lettres comme Œ ou Ç peuvent occuper plusieurs bytes;
mais on préferera MBLEN_MAX), mais elle est n'est pas exploitée par la
suite ; l'utilisation de sscanf est sujette à erreur, par exemple ici si
l'utilisateur tape un espace au début cela va être utilisé comme
proposition...

char saisie[4];
Il n'est pas logique, et potentiellement dangereux, d'utiliser des types
différents pour deux variables qui ont le même nom et à peu près la même
utilisation.

switch(type_affichage) {
case AFF_MENU_JEU : printf("nn");
Non. Ici, il faut fabriquer quatre fonctions, aff_menu_jeu(),
aff_resultat() etc. Les fonctions seront plus claires, les paramètres
serviront effectivement, tu gagnera un niveau d'indentation,...

printf( "nt Quel est votre choix ? ");
fgets(saisie, sizeof(saisie), stdin);
ret = sscanf(saisie, "%d", &choix_niveau);
Imagine le testeur un peu vicieux (genre moi), qui répond 00001 au
fgets(); saisie est limitée à 3 caractères, donc va contenir "000", ce
qui va provoquer un message de valeur incorrecte, suivi d'un tour de
boucle, et là ça passe ! incompréhensible si on ne lit pas le code...

case 1 : choix_niveau = 10;
NON. Il faut écrire
case 1 : choix_niveau = COUPS_FACILE;


printf( "nt Vous avez perdu. Le mot a trouver etait : %s",
On peut utiliser sans souci les accents dans les messages (sauf si on
s'appelle Marc E. et que l'on travaille sur des terminaux zarbi), c'est
quand même plus lisible.

fichier = fopen(FICHIER_MOT_SECRET, "r");
...
printf( "nt Le fichier dico.txt n'a pu etre ouvert."
Incohérent. Si tu utilises une constante pour le nom du fichier, il faut
être homogène et aussi l'utiliser pour le message d'insultes !

/* On ajoute le nouveau mot */
fprintf(fichier, "%sn", saisie);
Cas typique où il est bon de vérifier la valeur renvoyée par fprintf().


Voilà, c'est une brève analyse, j'espère que tu tireras profit de
certaines de mes remarques. Continue, tu me sembles bien parti.


Antoine
Avatar
candide
Beware a écrit :
Bonjour,



Bonjour,


Débutant dans l'apprentissage du langage C, j'ai crée un petit



Tu es un vrai débutant ? Quand je vois ton code, il y a de nombreux indices qui
selon moi montre que ça ne semble pas être le cas, sans doute connais-tu plus
ou moins un ou plusieurs autres langages ou alors tu es très doué ;) .

programme, un jeu du pendu. Le jeu à l'air de fonctionner. Je dis



Le Jeu du pendu ? L'idée provient du Site du Zéro ?

C'est vrai que c'est un très bon petit programme et qui est assez motivant.

"l'air de", car il est probable qu'il reste des bugs que je dois
corriger.



Tu as raison, il ne faut pas se fier à l'apparence d'un bon fonctionnement.
J'ai taché de faire fonctionner/planter ton programme, globalement c'est plutôt
bien. Néanmoins, j'ai quelques bugs, voici trois exemples :


1er exemple :
------------------------------------------------------------
################################
## ##
## JEU DU PENDU ##
## ------------ ##
## ##
################################


Options disponibles :
1 - Lancer une partie
2 - Entrer un nouveau mystere dans le dictionnaire
3 - Quitter


Quel est votre choix ? 55555555555555555555555555

Seuls les chiffres 1, 2 et 3 sont acceptes
Quel est votre choix ?
Seuls les chiffres 1, 2 et 3 sont acceptes
Quel est votre choix ?
Seuls les chiffres 1, 2 et 3 sont acceptes
Quel est votre choix ?
Seuls les chiffres 1, 2 et 3 sont acceptes
Quel est votre choix ?
Seuls les chiffres 1, 2 et 3 sont acceptes
Quel est votre choix ?
Seuls les chiffres 1, 2 et 3 sont acceptes
Quel est votre choix ?
Seuls les chiffres 1, 2 et 3 sont acceptes
Quel est votre choix ?
Seuls les chiffres 1, 2 et 3 sont acceptes
Quel est votre choix ?
Seuls les chiffres 1, 2 et 3 sont acceptes
Quel est votre choix ?
------------------------------------------------------------

Commentaire : je tape 20 ou 25 fois un chiffre et tu vois le résultat, ça
s'emballe ...


2ème exemple :
------------------------------------------------------------
Choisissez le niveau de difficulte :
1 - Niveau facile : 13 coups
2 - Niveau moyen : 12 coups
3 - Niveau difficile : 11 coups
4 - Niveau hardcore : 10 coups


Quel est votre choix ?
Le choix n'est pas valide. Seuls les chiffres
1 a 4 sont acceptes.
Quel est votre choix ?
Le choix n'est pas valide. Seuls les chiffres
1 a 4 sont acceptes.
Quel est votre choix ? ÿ

Le choix n'est pas valide. Seuls les chiffres
1 a 4 sont acceptes.
Quel est votre choix ? -

Le choix n'est pas valide. Seuls les chiffres
1 a 4 sont acceptes.
Quel est votre choix ? 2


Debut du jeu!!
--------------


Il vous reste 9 coups a jouer
Quel est le mot secret? * * * *
Proposez une lettre :
[4]+ Stopped ./x
------------------------------------------------------------
Commentaire : j'ai essayé de répondre un peu n'importe quoi puis j'ai choisi 2
et le jeu m'a sucré 3 coups (il y en avait 12 de prévu au départ).

3ème exemple :
------------------------------------------------------------
Il vous reste 2 coups a jouer
Quel est le mot secret? * * E *
Proposez une lettre : U

Il vous reste 1 coup a jouer
Quel est le mot secret? * * E U
Proposez une lettre : b

Le caractere saisi n'est pas une lettre. Seuls
les lettres de l'alphabet sont autorisees.
------------------------------------------------------------

Commentaire : La lettre b minuscule m'a été refusée.


Cependant ce n'est pas l'objet de ma question. En effet, dans un souci
de m'améliorer je désirerais avoir les commentaires de personnes
connaissant et maitrisant mieux le langage C que moi.



Mine de rien ce programme est difficile parce que l'interactivité nécessite de
traiter des entrées/sorties et pour peu que tu fasses des entrées sécurisées, ça
devient vite compliqué en C.

Je n'ai regardé ton code qu'en diagonale. Pour te donner un avis plus
approfondi, il faudrait que je code moi-même ce jeu du pendu et j'ai pas trop
envie pour l'instant. Disons que je trouve ton codage assez sobre, pas ampoulé
et relativement efficace. Globalement, l'impression est bonne voire très bonne
même si l'"algorithmique" du jeu me semble un peu lourde et parfois répétitive.

Quelques remarques en vrac et incomplètes :

*) (pas grave) Les commentaires qui paraphrasent le code (on ne commente pas
pareil si c'est juste pour soi ou si c'est pour être lu par d'autres, en
particulier d'autres qui connaissent le C)
*) (avis très perso) Trop de texte de messages dans le code (pour les menus),
moi je suis d'avis de les séparer ou les isoler du code
*) (à reprendre) Fonction affichage() beaucoup trop grosse
*) (détail) Fichier d'en-tête assez artificiel ici
*) (ma vision subjective) code parfois un peu compliqué : beaucoup de variables,
j'ai pas l'impression qu'il en faille autant
*) (détail) au lieu de
#define nOK 0
plutôt
#define KO 0
*) (détail) return toto; au lieu de return (toto);
*) (peut poser pb) ligne_choisie = (rand() % (nb_mots_disponible - 1));
et si nb_mots_disponible==1 ?
*) (ma vision subjective) si je peux m'éviter un malloc, je le fais parce qu'il
y a toujours un risque d'erreur ou de fuite. Avec :
motJoue = malloc(strlen(motSecret));
pourquoi malloc() puisque la taille max de motSecret est connue à l'avance ?
*) (à vérifier) Tu es sûr que :
motJoue[indice_tableau] = '';
n'entraîne jamais un débordement ?
*) printf( "nt Le mot entre est trop long. Il ne doit pas exceder"
"nt 10 caractere.");
Vaut mieux récupérer ta macro qui paramètre le nombre de caractères (ici 10)
*) Je trouve ceci curieux :
if (fichier != NULL) {
/* le fichier est bien ouvert */
}
else {
printf( "nt Le fichier dico.txt n'a pu etre ouvert."
"nt Verifiez la presence ou l'intitule du fichier.");
exit(0);
}
Surtout l'accolade vide !! Et exit(0) équivaut à return 0 et c'est la marque
d'une terminaison correcte du programme ("status successful termination" dit la
Norme), or si on n'a pas pu ouvrir le fichier ... Idem plus haut dans ton code
avec le retour de malloc()
*) A propos des remarques qui ont été faites sur fgets(), regarde sur le site du
zéro ou aussi je crois dans la faq de fclc (d'ici donc) la fonction purge() (ou
un terme analogue).


Les autres intervenants ont fait des remarques de fond plus substantielles et je
pense que tu aurais tout intérêt à en tenir compte même si ce n'est pas
forcément facile de parvenir à tout corriger pour obtenir un code orthodoxe.


Eric Levenez a écrit :

Il conviendrait de corriger ces warnings qui peuvent masquer des problèmes
car size_t est non signé et cela peut entraîner des problèmes dans d'autres
programmes.




Et tu recommandes quoi ? Ne pas utiliser size_t ou caster en int (par exemple)
ou autre chose encore ?



printf( "nt Vous avez perdu. Le mot a trouver etait : %s",
On peut utiliser sans souci les accents dans les messages (sauf si on
s'appelle Marc E. et que l'on travaille sur des terminaux zarbi), c'est
quand même plus lisible.




Avec la console Windows vaut mieux s'abstenir des accents.
Avatar
Beware
Merci a tous pour vos commentaires et vos critiques.
Avec tout ca, j'ai de quoi m'occuper. Désolé de ne pas répondre
précisément sur chaque point, il faut que j'analyse bien tout ce que
vous avez écrit.
Ah, juste un chose. Je ne comprends pas que vous ayez des erreurs de
compilation, j'utilise code:blocks (sous win et sous linux) et je n'ai
aucune erreur ni warning.
Avatar
candide
Beware a écrit :

Ah, juste un chose. Je ne comprends pas que vous ayez des erreurs de
compilation, j'utilise code:blocks (sous win et sous linux) et je n'ai
aucune erreur ni warning.



Si tu avais eu des erreurs, tu n'aurais pas eu d'exécutable. Quant aux warnings,
il faut ajouter l'option -W (ou -Wextra, c'est pareil).
Avatar
espie
In article <49bb9155$0$27525$,
candide wrote:
Beware a écrit :

Ah, juste un chose. Je ne comprends pas que vous ayez des erreurs de
compilation, j'utilise code:blocks (sous win et sous linux) et je n'ai
aucune erreur ni warning.



Si tu avais eu des erreurs, tu n'aurais pas eu d'exécutable. Quant aux warnings,
il faut ajouter l'option -W (ou -Wextra, c'est pareil).



Ca va un peu dependre de la version de gcc.
Chez moi, je n'ai les avertissements mentionnes que lorsque j'utilise
-pedantic.
Avatar
candide
Marc Espie a écrit :

Ca va un peu dependre de la version de gcc.



OK alors pour être plus précis, voici ce que ça donne chez moi :

:~$ gcc -v
Utilisation des specs internes.
Cible : i486-linux-gnu
Configuré avec: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2
--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr
--enable-targets=all --enable-checking=release --build=i486-linux-gnu
--host=i486-linux-gnu --target=i486-linux-gnu
Modèle de thread: posix
version gcc 4.2.3 (Ubuntu 4.2.3-2ubuntu7)

:~$ gcc -W main.c
main.c: Dans la fonction «main» :
main.c:69: attention : comparaison entre élément signé et élément non signé
main.c: Dans la fonction «test_lettre» :
main.c:176: attention : comparaison entre élément signé et élément non signé
main.c: Dans la fonction «nouveau_motSecret» :
main.c:451: attention : comparaison entre élément signé et élément non signé


Chez moi, je n'ai les avertissements mentionnes que lorsque j'utilise
-pedantic.





Je trouve ça curieux que pedantic avertisse pour du signé/non signé. Chez moi,
ça donne :

:~$ gcc -pedantic -stdÈ9 main.c
Dans le fichier inclus à partir de main.c:6:
pendu.h:32:8: attention : éléments lexicaux superflus à la fin de la directive
#endif
:~$ gcc -pedantic -stdÉ9 main.c
:~$
Avatar
Eric Levenez
Le 14/03/09 10:47, dans <49bb7d46$0$21963$,
« candide » a écrit :

Eric Levenez a écrit :

Il conviendrait de corriger ces warnings qui peuvent masquer des problèmes
car size_t est non signé et cela peut entraîner des problèmes dans d'autres
programmes.



Et tu recommandes quoi ? Ne pas utiliser size_t ou caster en int (par exemple)
ou autre chose encore ?



Comme strlen retourne un nombre >= 0, je "casterais" en int le code de
retour de strlen.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
1 2 3 4 5