Probleme avec le code source
Fermé
jhonbouda
Messages postés
25
Date d'inscription
samedi 21 juin 2014
Statut
Membre
Dernière intervention
30 décembre 2014
-
10 juil. 2014 à 20:56
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 11 juil. 2014 à 11:50
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 11 juil. 2014 à 11:50
A voir également:
- Probleme avec le code source
- Le code ascii - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Code activation windows 10 - Guide
- Code gta 4 ps4 - Guide
5 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
10 juil. 2014 à 22:30
10 juil. 2014 à 22:30
Bonjour,
Il vaut mieux rester sur le même topic tant que ton code n'est pas fonctionnel. Là, on en est au 4ème post portant sur le même code. Du coup, pas évident de suivre l'évolution...
Donc pour la suite, merci de ne plus ouvrir d'autres posts tant que cela concerne ce code.
Pour les balises code, c'est mieux mais je t'avais dit de plutôt utiliser <"code c">/*ici je mets mon code*/<"/code"> (sans guillemets).
Sinon, ton code a bien progressé ;-). Il est beaucoup plus lisible.
//lews compteurs
int i, j;
i = 0;
j = 0;
C'est déconseillé d'utiliser des variables globales... Surtout avec des noms de variable si courant... Sinon pour info, pas besoin de mettre i=0 et j=0 ; ça sera initialisé automatiquement à 0. Je te conseille de plutôt passer ces variables par paramètre. Les goto sont également à éviter. En revoyant ton algorithme, tu devrais pouvoir t'en passer.
char *nom;
Il faut faire de l'allocation dynamique si tu utilises un pointeur (malloc()...). Ou sinon, char nom[TAILLE];
Pour viderbuffer(), cela sert à vider les résidus de caractères dans le buffer clavier. Cela n'est pas forcément des erreurs de saisie de l'utilisateur.
t_facture[j].nom = t_cheque[k].nomclient;
Si nom est un pointeur comme tu as fait, cela est correct. Néanmoins, je pense que tu devrais plutôt passer par un tableau (cf. ci-dessus) et copier avec strcpy().
for(inc = 0; inc <= i; inc++)
Plutôt inc <i non ? Le dernier élément est i-1. i correspond à la prochaine place dans le tableau où tu peux écrire.
res = scanf("%d",&choixMenu);/* la je pense qu'on a affecte la
res ne sert à rien ici puisque tu ne t'en sers pas. Et non, cela ne contient pas le nombre tapé par l'utilisateur. Cela renvoie le nombre de variables correctement assignées. Ici, cela te renverra 1 (sauf erreur de saisie par l'utilisateur).
system("cls");
Ce n'est pas portable... Comme les fonctions déclarées dans conio.h d'ailleurs. Pourquoi effacer l'écran ? Cela énerve généralement plus qu'autre chose les personnes ;-).
Corrige déjà tout ça, reposte ton code et précise plus en détail ce qui ne fonctionne pas.
Il vaut mieux rester sur le même topic tant que ton code n'est pas fonctionnel. Là, on en est au 4ème post portant sur le même code. Du coup, pas évident de suivre l'évolution...
Donc pour la suite, merci de ne plus ouvrir d'autres posts tant que cela concerne ce code.
Pour les balises code, c'est mieux mais je t'avais dit de plutôt utiliser <"code c">/*ici je mets mon code*/<"/code"> (sans guillemets).
Sinon, ton code a bien progressé ;-). Il est beaucoup plus lisible.
//lews compteurs
int i, j;
i = 0;
j = 0;
C'est déconseillé d'utiliser des variables globales... Surtout avec des noms de variable si courant... Sinon pour info, pas besoin de mettre i=0 et j=0 ; ça sera initialisé automatiquement à 0. Je te conseille de plutôt passer ces variables par paramètre. Les goto sont également à éviter. En revoyant ton algorithme, tu devrais pouvoir t'en passer.
char *nom;
Il faut faire de l'allocation dynamique si tu utilises un pointeur (malloc()...). Ou sinon, char nom[TAILLE];
Pour viderbuffer(), cela sert à vider les résidus de caractères dans le buffer clavier. Cela n'est pas forcément des erreurs de saisie de l'utilisateur.
t_facture[j].nom = t_cheque[k].nomclient;
Si nom est un pointeur comme tu as fait, cela est correct. Néanmoins, je pense que tu devrais plutôt passer par un tableau (cf. ci-dessus) et copier avec strcpy().
for(inc = 0; inc <= i; inc++)
Plutôt inc <i non ? Le dernier élément est i-1. i correspond à la prochaine place dans le tableau où tu peux écrire.
res = scanf("%d",&choixMenu);/* la je pense qu'on a affecte la
res ne sert à rien ici puisque tu ne t'en sers pas. Et non, cela ne contient pas le nombre tapé par l'utilisateur. Cela renvoie le nombre de variables correctement assignées. Ici, cela te renverra 1 (sauf erreur de saisie par l'utilisateur).
system("cls");
Ce n'est pas portable... Comme les fonctions déclarées dans conio.h d'ailleurs. Pourquoi effacer l'écran ? Cela énerve généralement plus qu'autre chose les personnes ;-).
Corrige déjà tout ça, reposte ton code et précise plus en détail ce qui ne fonctionne pas.
jhonbouda
Messages postés
25
Date d'inscription
samedi 21 juin 2014
Statut
Membre
Dernière intervention
30 décembre 2014
1
10 juil. 2014 à 23:47
10 juil. 2014 à 23:47
merci pour les conseils en fait j'ai compiler l' ancien code par erreur, excusez moi car les deux fichiers .c ont exactement le meme nom j'ai oublie de supprimer celui qui ne marchait pas merci d'avoir pris le temps de me repondre et encore desole.
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 11/07/2014 à 10:03
Modifié par [Dal] le 11/07/2014 à 10:03
int i, j;
i = 0;
j = 0;
C'est déconseillé d'utiliser des variables globales... Surtout avec des noms de variable si courant... Sinon pour info, pas besoin de mettre i=0 et j=0 ; ça sera initialisé automatiquement à 0.
juste pour clarifier : l'initialisation est faite implicitement à zéro pour les variables globales et les variables statiques, mais pas pour les variables locales à une fonction (variables dites "automatiques"), qui, si elles ne sont pas initialisées ont un contenu indéterminé.
comme c'est une subtilité du C, et qu'il faut très bien savoir ce que l'on fait et pourquoi si on choisit de ne pas initialiser explicitement, je suis plutôt d'avis que l'initialisation explicite est préférable systématiquement. Surtout lorsque l'on débute.
Dal
i = 0;
j = 0;
C'est déconseillé d'utiliser des variables globales... Surtout avec des noms de variable si courant... Sinon pour info, pas besoin de mettre i=0 et j=0 ; ça sera initialisé automatiquement à 0.
juste pour clarifier : l'initialisation est faite implicitement à zéro pour les variables globales et les variables statiques, mais pas pour les variables locales à une fonction (variables dites "automatiques"), qui, si elles ne sont pas initialisées ont un contenu indéterminé.
comme c'est une subtilité du C, et qu'il faut très bien savoir ce que l'on fait et pourquoi si on choisit de ne pas initialiser explicitement, je suis plutôt d'avis que l'initialisation explicite est préférable systématiquement. Surtout lorsque l'on débute.
Dal
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
11 juil. 2014 à 11:13
11 juil. 2014 à 11:13
Pour ma part, la règle est encore plus simple. Quand on débute : pas de variable globale :-).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 11/07/2014 à 11:51
Modifié par [Dal] le 11/07/2014 à 11:51
si tu veux, mais puisque tu conseilles l'usage de variables locales, il faudra une initialisation explicite systématique, et qu'il mette à zéro ses compteurs.
sur res, je ne suis pas d'accord avec ton observation. Bien sûr res ne contient pas la saisie, comme tu le soulignes (et contrairement à ce qu'indique de façon trompeuse le commentaire dans le code), mais il est correctement utilisé dans le
en passant, il devrait en revanche initialiser choixMenu, par exemple à -1, car là choixMenu peut contenir n'importe quoi avant le scanf, qui ne modifiera pas la valeur de choixMenu si l'entrée de l'utilisateur ne correspond pas au spécificateur.
Dal
sur res, je ne suis pas d'accord avec ton observation. Bien sûr res ne contient pas la saisie, comme tu le soulignes (et contrairement à ce qu'indique de façon trompeuse le commentaire dans le code), mais il est correctement utilisé dans le
}while(res == 0 || choixMenu<QUITTER || choixMenu>CONSO);où, si l'utilisateur tape autre chose qu'un entier, le menu sera affiché de nouveau.
en passant, il devrait en revanche initialiser choixMenu, par exemple à -1, car là choixMenu peut contenir n'importe quoi avant le scanf, qui ne modifiera pas la valeur de choixMenu si l'entrée de l'utilisateur ne correspond pas au spécificateur.
Dal