IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

probleme d'execution programme en c


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut probleme d'execution programme en c
    Salut les amis j'écris deux programme, l'un chargé de créer p factures et l'autre n chèques :
    facture code source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include<stdlib.h>
    #include<stdio.h>
     
     
    struct facture{
    int code;
    char nom[20];
    int bp;
    char ville[20];
    int tel;
    float montant;
    int index_deb;
    int index_fin;
    };
     
    void creer_facture(int code,char nom[20],int index_deb,int index_fin,int bp,char ville[20],int tel,float montant)
    {
        printf("entrez le code\n");
        scanf("%d",&code);
        printf("nom\n");
        scanf("%s",&nom);
        printf("bp\n");
        scanf("%d",&bp);
        printf("ville\n");
        scanf("%s",&ville);
        printf("tel\n");
        scanf("%d",&tel);
        printf("entrez l index\n");
        scanf("%d",&index_deb);
        printf("index fin\n");
        scanf("%d",&index_fin);
        printf("entrer montant\n");
        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,ville;
        float montantfact;
        printf("remplissez la facture\n");
        creer_facture(codefact,nom,bp,ville,tel,indexdeb,indexfin,montantfact);
        return 0;
    }
    code source chèque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include<stdlib.h>
    #include<stdio.h>
     
     
    struct cheque{
    int numcheque;
    int numcompte;
    float montantpaye;
    char nomclient[20];
    int codefacture;
    };
     
    void creer_cheque(int numcheque,int numcompte,float montantpaye,char nomclient[20],int codefacture)
    {
        printf("entrez le numero d cheque\n");
        scanf("%d",&numcheque);
        printf("numero du compte\n");
        scanf("%d",&numcompte);
        printf("montant paye\n");
        scanf("%d",&montantpaye);
        printf("nom du client\n");
        scanf("%s",&nomclient);
        printf("code facture\n");
        scanf("%d",&codefacture);
        printf("le cheque se presente comme suit :\n numero du cheque:%d\n numero du compte:%d\n montant paye:%f\n nom du client:%s\n code facture:%d\n",numcheque,numcompte,montantpaye,nomclient,codefacture);
    }
    int main()
    {
        int numcheque,numcompte,codefacture;
        char nomclient;
        float montantpaye;
        printf("remplissez la facture\n");
        creer_cheque(numcheque,numcompte,montantpaye,nomclient,codefacture);
        return 0;
    }
    chaque fois que j'exécute j'ai:

    Nom : Capture.PNG
Affichages : 187
Taille : 32,7 Ko

    aidez moi svp

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Utilise la balise code (le bouton #), ca sera plus lisible (coloration et indentation)

    a priori, tu as un bug, type segmentation fault.

    C'est le cas le plus fréquent de plantage sauvage.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu as un soucis de compréhension concernant le passage de paramètres

    Les parametres d'une fonction sont des variables "comme les autres", ayant l'appel de la fonction pour portée, et initialisée comme toutes les autres: en copiant une valeur dedans.

    La valeur est fournie explicitement, sqrt(4);, ou par une variable sqrt(x);.

    Dans ton cas précis, tu crée plein de paramètres, pour ta fonction qui seront des copies des variables créées dans le main.
    (Le comportement est correct uniquement pour les tableaux)

    En utilisant des pointeurs, comme on le fais avec scanf, tu pourras modifier la mémoire pointée, c'est à dire la variable dont l'adresse est fournie lors de l'appel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void doubler(int *var) {
        *var = 2 * var; //ou *var *=2
    }
     
    int main() {
        int x = 2;
        printf ("x=%d\t", x);
        doubler (&x);
        printf ("x=%d", x);
    }
    Ce code affichera "x=2 x=4"

    Pour les tableaux, c'est légèrement différent, car le nom d'un tableau est l'adresse de son premier élément (c'est à dire un pointeur vers celui-ci)

    Ton premier code sert à créer une facture, fait deux petites fonctions, pour créer et afficher une facture.
    Comme tu ne veux pas recopier une structure aussi grosse, tu utiliseras des pointeurs.

    J'introduis au passage un typedef pour simplifier l'écriture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #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_t;
     
    void creer_facture(facture_t * facture) {
        printf("entrez le code\n");
        scanf("%d",&facture->code);
        printf("nom (<20 caracteres)?\n");
        scanf("%s",&facture->nom);
        printf("bp?\n");
        scanf("%d",&facture->bp);
        printf("ville (<20 caracteres)?\n");
        scanf("%s?",&facture->ville);
        printf("tel?\n");
        scanf("%d?",&facture->tel);
        printf("entrez l index?\n");
        scanf("%d?",&facture->index_deb);
        printf("index fin?\n");
        scanf("%d",&facture->index_fin);
        printf("entrer montant?\n");
        scanf("%f",&facture->montant);
    }
     
    void afficher_facture(facture_t const * facture) {
     /*
     il n'y a pas de virgule entre les chaines
     car deux chaines littérales qui se suivent sont vues comme une seule par le compilateur
     */
    	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",
    		facture->code, facture->nom,
    		facture->bp, facture->ville, facture->tel,
    		facture->index_deb, facture->index_fin, facture->montant
    	);
    }
     
    int main() {
        facture_t facture;
        printf("Remplissez la facture\n");
        creer_facture(&facture);
        printf("Merci.\n"
        afficher_facture(&facture);
        return 0;
    }
    Par contre, ton code de saisie me semble normal. Comme ca fait longtemps que je ne fais plus vraiment de C, je ne vois pas le problème.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Tu compiles avec quelle commande ?
    Qu'est-ce qui s'affiche dans le terminal quand tu lances la compilation ?
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    Salut,

    Dans ton main() tu déclares nom et ville de type char, que tu passes à creer_facture() qui attend non pas des char mais des char[20].
    Ensuite tu fais deux scanf("%s", ...) avec nom et ville ; scanf attend un char**, et va écraser la valeur de ce pointeur par celle d'une chaîne qu'il aura créée (contenant ce qu'a tapé l'utilisateur). Sauf que là vu que t'as casté un char en char[20] dans l'appel de fonction sans le vouloir, bah je sais pas exactement comment c'est géré, mais y'a sûrement une c*uille due à ça et c'est allé écraser je sais pas quelle valeur dans la stack, sûrement pas la bonne.
    Enfin tu fais un printf() après avoir demandé à l'utilisateur d'entrer un montant. Ton printf() prend nom et ville, mais ceux-ci ne sont pas valides -> bam, segmentation fault.

  6. #6
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Points : 234
    Points
    234
    Par défaut
    Bonjour,
    Tout ce que les membre t'ont dit est vrai et valable dans ton cas (passage par adresse,cast etc...) mais je pense que le passage par adresse par exemple fera que tu aura un résultat inattendu à cause de l'histoire des copies...et ça ne fera "peut être" pas forcement planter ton prog
    Il y a juste un petit truc que je ne comprend pas:
    Pourquoi dans la photo que tu met il y a cheque.exe alors que le code est celui de facture et la méthode exécutée est celle de facture alors qu'elle est inconnue par cheque???
    Comment compile-tu?

    En tout cas , tu dois savoir ce que tu veux faire si tu compte utiliser les valeurs enregistrées dans ta fonction plus tard dans ton code il faut des passages par adresses sinon si c'est uniquement pour un affichage,tu as même pas besoin de les passer en paramètres;

    si ton souci est uniquement que ton programme s’exécute voici un code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include<stdlib.h>
    #include<stdio.h>
     
    void creer_cheque(int numcheque,int numcompte,float montantpaye,char*  nomclient,int codefacture)
    {
        nomclient=malloc(sizeof(char)*20);
        printf("entrez le numero d cheque\n");
        scanf("%d",&numcheque);
        printf("numero du compte\n");
        scanf("%d",&numcompte);
        printf("montant paye\n");
        scanf("%f",&montantpaye);
        printf("nom du client\n");
        scanf("%s",nomclient);
        printf("code facture\n");
        scanf("%d",&codefacture);
       printf("le cheque se presente comme suit :\n numero du cheque:%d\n numero du compte:%d\n montant paye:%f\n nom du client:%s\n code facture:%d\n",numcheque,numcompte,montantpaye,nomclient,codefacture);
    }
    Il fallait allouer de la memoire;
    je ne vois pas pourquoi tu déclares un structure si c'est pour la forme(voir réponse de leternel),en plus les paramètres passés à ta fonction ne servent à rien du tout
    Bon courage

  7. #7
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut merci pour votre aide
    je vous remerci pour votre aide

  8. #8
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut besoin d'aide
    slt a tous et merci pour votre aide
    pour le code en fait j'ai execute l'ancien code par erreur .
    je dois rendre le projet demin et j ne suit pas sur de le terminer pouvez vous m'aider avec des idees pour les autres procedures qui sont :


    une procédure qui permet de rechercher une facture connaissant son chèque.
    • une procédure qui permet d'insérer un nouveau chèque dans le vecteur de chèque
    uniquement si la facture correspondante n'a pas encore été payée.
    Les chèques sont triés dans l'ordre croissant des codes chèque.
    • une procédure qui écrit dans l'ordre alphabétique des noms des clients.
    • une procédure qui affiche la liste des clients d’une ville donnée
    • une procédure qui affiche la liste des clients d’une ville donnée dont le montant à
    payer est supérieure à un certain montant que l’utilisateur précisera
    • une procédure qui prend les chèques dans l'ordre dont il se présente. Pour chaque
    chèque, parcourir la liste des factures pour rechercher la facture correspondante. Si
    cette facture est trouvée, enlever chèque et facture de leur vecteur respectif.
    NB: Envisager les deux cas suivants (proposez une fonction typique de chaque cas):
    o Les chèques et les factures ne sont pas triés.
    o Les chèques et les factures sont triés.
    • une procédure qui affiche la liste des factures non payées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme d execution programme perl
    Par calimero642 dans le forum Langage
    Réponses: 4
    Dernier message: 13/07/2006, 12h49
  2. Problème execution programme SDL
    Par youp_db dans le forum SDL
    Réponses: 2
    Dernier message: 11/02/2006, 18h06
  3. Probleme execution programme
    Par jmjmjm dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/11/2005, 19h32
  4. [Kylix] probleme execution programme
    Par vin's dans le forum EDI
    Réponses: 1
    Dernier message: 31/03/2004, 12h25
  5. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo