Probleme d'execution programme en c
Fermé
jhonbouda
Messages postés
25
Date d'inscription
samedi 21 juin 2014
Statut
Membre
Dernière intervention
30 décembre 2014
-
25 juin 2014 à 18:27
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 4 juil. 2014 à 23:20
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 4 juil. 2014 à 23:20
A voir également:
- Probleme d'execution programme en c
- Programme demarrage windows 10 - Guide
- Mettre en veille un programme - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Désinstaller programme windows 10 - Guide
- Sms programmé - Guide
5 réponses
ElementW
Messages postés
4814
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 227
Modifié par gravgun le 25/06/2014 à 18:41
Modifié par gravgun le 25/06/2014 à 18:41
'lut, le problème se trouve ici:
On ne met pas de tableau avec une taille dans les paramètres, on met soit sans taille:
Et comme on a un pointeur, on vire l'esperluette du scanf:
Et du coup, il faut passer un
Attention toutefois, si on tape un nom plus long que 19 caractères, de mauvaises choses peuvent arriver...
Pour le programme de facture, c'est la même chose avec
from human import idiocy
del idiocy
...float montantpaye,char nomclient[20],int codefacture...
On ne met pas de tableau avec une taille dans les paramètres, on met soit sans taille:
char nomclient[], soit en tant que pointeur:
char *nomclient, sachant que les deux reviennent exactement au même.
Et comme on a un pointeur, on vire l'esperluette du scanf:
scanf("%s",nomclient);
Et du coup, il faut passer un
char*à la fonction, qui contient un espace suffisant pour le nom, et on l'alloue dans le main:
char nomclient[20]; ... creer_cheque(numcheque,numcompte,montantpaye,nomclient,codefacture);Et là c'est automagique, ça marche!
Attention toutefois, si on tape un nom plus long que 19 caractères, de mauvaises choses peuvent arriver...
Pour le programme de facture, c'est la même chose avec
nomet
ville.
from human import idiocy
del idiocy
jhonbouda
Messages postés
25
Date d'inscription
samedi 21 juin 2014
Statut
Membre
Dernière intervention
30 décembre 2014
1
Modifié par jhonbouda le 25/06/2014 à 19:11
Modifié par jhonbouda le 25/06/2014 à 19:11
merci beaucoup gravgun de m'avoir aider j'ai corrige le code maintenant pour le montant paye j'ai 0.00000 quel que soit la valeur entree je ne sai pas si jai tout bien fait comme vous avez dit


[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
Modifié par [Dal] le 25/06/2014 à 19:18
Modifié par [Dal] le 25/06/2014 à 19:18
Sauf que :
- tu ne te sers pas de la struct que tu as créé et qui ne sert à rien
- que l'intérêt d'une telle fonction de "création" comme creer_cheque() serait d'initialiser des données utilisables dans le reste du programme, ce qui n'est pas le cas dans ton implémentation, puisque les données saisies avec les scanf n'auront de durée de vie que limitée à la fonction et n'existeront plus au retour de la fonction
Donc, il faudrait que tu modifies ta fonction pour permettre le passage de pointeurs sur les variables à initialiser.. qui devraient être des variables utilisant l'espace mémoire structuré par la struct que tu définis, tant qu'à faire, pour que ta struct ne soit pas juste décorative.
outres les erreurs déjà signalées, ton scanf pour un float ne devrait pas utiliser le spécificateur %d, mais %f (d'ailleurs, pourquoi un float et pas un double).
de plus, si tu passes des pointeurs sur les données, tu auras déjà des pointeurs pour tes scanf, et tu devras en tenir compte quand tu écriras les scanf (ou tu passes un pointeur sur une structure, ce qui simplifiera ton prototype de fonction).
Dal
- tu ne te sers pas de la struct que tu as créé et qui ne sert à rien
- que l'intérêt d'une telle fonction de "création" comme creer_cheque() serait d'initialiser des données utilisables dans le reste du programme, ce qui n'est pas le cas dans ton implémentation, puisque les données saisies avec les scanf n'auront de durée de vie que limitée à la fonction et n'existeront plus au retour de la fonction
Donc, il faudrait que tu modifies ta fonction pour permettre le passage de pointeurs sur les variables à initialiser.. qui devraient être des variables utilisant l'espace mémoire structuré par la struct que tu définis, tant qu'à faire, pour que ta struct ne soit pas juste décorative.
outres les erreurs déjà signalées, ton scanf pour un float ne devrait pas utiliser le spécificateur %d, mais %f (d'ailleurs, pourquoi un float et pas un double).
de plus, si tu passes des pointeurs sur les données, tu auras déjà des pointeurs pour tes scanf, et tu devras en tenir compte quand tu écriras les scanf (ou tu passes un pointeur sur une structure, ce qui simplifiera ton prototype de fonction).
Dal
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
Modifié par [Dal] le 25/06/2014 à 20:00
Modifié par [Dal] le 25/06/2014 à 20:00
Je ne sais pas quel compilateur tu utilises, mais une compilation avec gcc et les warnings (option -Wall) t'alerte sur bon nombre des problèmes signalés par gravgun et moi même, y compris le problème de spécificateur %d au lieu de f% (qui est sans doutes à l'origine du pb que tu mentionnes d'absence de prise en compte de la saisie du montant).
Compile toujours avec les warnings, comprend la raison de chaque warning, et traite les un par un.
Dal
Compile toujours avec les warnings, comprend la raison de chaque warning, et traite les un par un.
Dal
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
4 juil. 2014 à 15:13
4 juil. 2014 à 15:13
sans compter ses scanf qui sont pas géré
jhonbouda
Messages postés
25
Date d'inscription
samedi 21 juin 2014
Statut
Membre
Dernière intervention
30 décembre 2014
1
26 juin 2014 à 23:37
26 juin 2014 à 23:37
merci pour votre aide je vais essayer d'ameliorer le code
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
27 juin 2014 à 11:06
27 juin 2014 à 11:06
Bonjour,
Merci d'éviter les posts doubles... Il aurait été préférable de continuer dans : https://forums.commentcamarche.net/forum/affich-30395336-projet-de-programmation
Enfin trop tard. Continuons ici maintenant.
Merci d'éviter les posts doubles... Il aurait été préférable de continuer dans : https://forums.commentcamarche.net/forum/affich-30395336-projet-de-programmation
Enfin trop tard. Continuons ici maintenant.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
slt les amis merci de m'avoir accepte sur le forum. j'ai un probleme avec mon code lorsque je l'execute apres un instant j'ai une message d'erreur de windows . egalement on m'a dit que la structure que j'ai definie n'est pas utilise par le programme. vu que je suis debutant je ne sais pas trop quoi faire.
le code:
'''c
#include<stdlib.h>
#include<stdio.h>
typedef struct facture
{
int code;
char nom[20];
int bp;
char ville[20];
int tel;
float montant;
int index_deb;
int index_fin;
}facture;
void creer_facture(int code,char *nom,int index_deb,int index_fin,int bp,char *ville,int tel,float montant)
{
printf("entrez le code:\t");
scanf("%d",&code);
printf("nom:\t");
scanf("%s",nom);
printf("bp:\t");
scanf("%d",&bp);
printf("ville:\t");
scanf("%s",&ville);
printf("tel:\t");
scanf("%d",&tel);
printf("entrez l index:\t");
scanf("%d",&index_deb);
printf("index fin:\t");
scanf("%d",&index_fin);
printf("entrer montant:\t");
scanf("%f",&montant);
printf("la facture se presente comme suit :\n code:%d\n nom:%s\n bp:%d\n ville:%s\n tel:%d\n index debut:%d\n index fin:%d\n montant:%f\n",code,nom,bp,ville,tel,index_deb,index_fin,montant);
}
int main()
{
int codefact,indexdeb,indexfin,tel,bp;
char nom[20];
char ville[20];
float montantfact;
printf("remplissez la facture\n");
creer_facture(codefact,nom,bp,ville,tel,indexdeb,indexfin,montantfact);
return 0;
}
'''
le code:
'''c
#include<stdlib.h>
#include<stdio.h>
typedef struct facture
{
int code;
char nom[20];
int bp;
char ville[20];
int tel;
float montant;
int index_deb;
int index_fin;
}facture;
void creer_facture(int code,char *nom,int index_deb,int index_fin,int bp,char *ville,int tel,float montant)
{
printf("entrez le code:\t");
scanf("%d",&code);
printf("nom:\t");
scanf("%s",nom);
printf("bp:\t");
scanf("%d",&bp);
printf("ville:\t");
scanf("%s",&ville);
printf("tel:\t");
scanf("%d",&tel);
printf("entrez l index:\t");
scanf("%d",&index_deb);
printf("index fin:\t");
scanf("%d",&index_fin);
printf("entrer montant:\t");
scanf("%f",&montant);
printf("la facture se presente comme suit :\n code:%d\n nom:%s\n bp:%d\n ville:%s\n tel:%d\n index debut:%d\n index fin:%d\n montant:%f\n",code,nom,bp,ville,tel,index_deb,index_fin,montant);
}
int main()
{
int codefact,indexdeb,indexfin,tel,bp;
char nom[20];
char ville[20];
float montantfact;
printf("remplissez la facture\n");
creer_facture(codefact,nom,bp,ville,tel,indexdeb,indexfin,montantfact);
return 0;
}
'''
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
4 juil. 2014 à 23:20
4 juil. 2014 à 23:20
Pour bien indenter le code, il faut mettre entre deux balises codes comme suite :
<"code c>ici tu mets ton code<"/code"> (sans les guillemets).
Dans ton code, tu définies une belle structure, mais tu ne t'en sers pas du tout. Du coup, elle ne sert à rien.
Dans ton main, plutôt que déclarer nom, ville et compagnie, tu as juste à faire struct facture f; D'ailleurs pour info, c'est mieux de mettre une majuscule au nom de la structure : struct Facture; (ce n'est que convention).
Ensuite, il faut faire une boucle for pour pouvoir créer plusieurs factures. Et il manque la structure Cheque.
<"code c>ici tu mets ton code<"/code"> (sans les guillemets).
Dans ton code, tu définies une belle structure, mais tu ne t'en sers pas du tout. Du coup, elle ne sert à rien.
Dans ton main, plutôt que déclarer nom, ville et compagnie, tu as juste à faire struct facture f; D'ailleurs pour info, c'est mieux de mettre une majuscule au nom de la structure : struct Facture; (ce n'est que convention).
Ensuite, il faut faire une boucle for pour pouvoir créer plusieurs factures. Et il manque la structure Cheque.
4 juil. 2014 à 23:16
C'est parfaitement admis. C'est juste que la valeur est ignorée puisque le compilateur convertit en pointeur. Donc, l'erreur ne se situe pas là.