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 :

débutant - Problème programme C sous windows


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut débutant - Problème programme C sous windows
    Bonjour,
    voilà j'ai un petit problème, je me suis fais un petit programme en C, qui suivant une effectif dans un tableau devrait me renvoyer le pourcentage que représente une valeur sur le total du tableau.

    Par exemple, si j'ai un tableau avec comme valeurs 500, 100, 300, 50, 50 il devrait me renvoyer 50%, 10, 30, 5, 5.

    Seulement au moment où je lance le programe windows me met le message d'erreur : xxxxxx.exe a rencontré un problème et doit fermer. Enfin le message d'erreur microsoft quoi !!! je comprend voilà le script :

    Si quelqu'un peut m'aider... merci beaucoup...

    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
    #include <stdio.h>
     
    void affichage(int n, int t[])
    {
        for(int i=0; i<n ; i++)
        {
            printf("%d --> %d",i,t[i]);
        }
    }
     
    void saisie(int n, int t[])
    {
        printf("Tableau :");
        for(int i=0; i<n ; i++)
        {
            scanf("%d",&t[i]);
        }
    }
     
    void pct(int n, int t[],int c[])
    {int s=0;
        for(int i=0; i<n ; i++)
        {
            s=s+t[i];
        }
        for(int i=0; i<n ; i++)
        {
            c[i]=t[i]*100/s;
        }
    }
     
    int main()
    {int n; int t[n]; int c[n];
        saisie(n,t);
        pct(n,t,c);
        affichage(n,t);
        affichage(n,c);
    }

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Bonsoir,

    1) Avant de compiler un programme, bien configurer son compilateur.
    2) Une fois le compilateur bien configuré, lire les avertissements et les messages d'erreur, en tenir compte et corriger le programme en conséquence jusqu'à ne plus en avoir un seul (cela éliminera bien des problèmes).
    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
    $ gcc -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -o t295322 t295322.c 
    t295322.c: In function `affichage':
    t295322.c:5: error: 'for' loop initial declaration used outside C99 mode
    t295322.c: In function `saisie':
    t295322.c:14: error: 'for' loop initial declaration used outside C99 mode
    t295322.c: In function `pct':
    t295322.c:22: error: 'for' loop initial declaration used outside C99 mode
    t295322.c:26: error: redefinition of 'i'
    t295322.c:22: error: previous definition of 'i' was here
    t295322.c:26: error: 'for' loop initial declaration used outside C99 mode
    t295322.c: At top level:
    t295322.c:33: warning: function declaration isn't a prototype
     
    $ gcc -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -std=c99 -o t295322 t295322.c 
    t295322.c:33: warning: function declaration isn't a prototype
    t295322.c: In function `main':
    t295322.c:33: warning: 'n' might be used uninitialized in this function
    3) Deux prototypes possibles pour la fonction "main" :OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main ( int argc, char *argv[] );
    "int main()" n'est pas une de ces deux possibilités.

    Cordialement,
    DS.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i=0; i<n ; i++)
    {
    on ne peut pas faire ça en C mais en C++ oui donc le fichier du code source doit avoir .cpp donc pedro134 utilise la bonne terminologie merci

    Si tu as un plantage apprends aussi à utiliser le déboguer intégré à ton compilateur ; c'est surement un dépassement de tableau à vue de nez

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Mat.M
    [...] c'est surement un dépassement de tableau à vue de nez
    A vue de compilateur, je dirai plutôt accès à une zone indéterminée de la mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t295322.c:33: warning: 'n' might be used uninitialized in this function
    (car on ne peut pas vraiment avoir un "dépassement de tableau" si ce dernier n'a pas de taille...mais ça devient philosophique là...).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 103
    Points : 113
    Points
    113
    Par défaut
    D'après ce que je sais, en C on ne peut utiliser une variable pour définir un tableau.
    Donc la déclaration des tableaux est fausse.
    S'éloigner, ce n'est pas forcément partir.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par David.Schris
    A vue de compilateur, je dirai plutôt accès à une zone indéterminée de la mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t295322.c:33: warning: 'n' might be used uninitialized in this function
    (car on ne peut pas vraiment avoir un "dépassement de tableau" si ce dernier n'a pas de taille...mais ça devient philosophique là...).
    Pareil, n n'est pas initialisée quand tu l'appelles dans saisie(...)

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par 30barrett40
    D'après ce que je sais, en C on ne peut utiliser une variable pour définir un tableau.
    Donc la déclaration des tableaux est fausse.
    En fait, en C99, il est possible d'utiliser une variable pour définir la taille d'un tableau [1] MAIS il faut que cette variable soit initialisée...sinon le comportement est indéterminé...

    Cordialement,
    DS.

    [1] Et même la valeur retournée par une fonction. Exemple :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* ... */
     
    void maFonction( char *chaine ) {
        int tableau[strlen(chaine)];
        /* ... */
    }
     
    /* ... */
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Salut,

    Je pense que l'erreur se situe à ce niveau-là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main()
    {int n; int t[n]; int c[n];
    saisie(n,t);
    Tu déclares t et c avec un nombre de cases non défini. Sachant que lorsque tu écris
    n aura une valeur aléatoire très grande, cela peut provoquer ton erreur.

    Pour corriger cela, il te faut déclarer ton tableau ainsi
    Puis saisir la valeur de n, et ensuite définir la taille du tableau avec un malloc (voire un new si tu es en C++).

    Bon courage

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Stupeflip
    [...]
    n aura une valeur aléatoire très grande
    [...]
    Preuve ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n;
    printf("%i",n);
    T'obtiens un nombre en XXXXXXXXX ou en -XXXXXXXXX

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En mode Debug sous Visual, on a une valeur de 0xCCCCCCCC, soit 3 435 973 836 pour un nombre non-signé ou -858 993 460 pour un nombre signé.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Stupeflip
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n;
    printf("%i",n);
    T'obtiens un nombre en XXXXXXXXX ou en -XXXXXXXXX
    Cela dépend du compilateur (version y comprise), des options utilisées pour la compilation et éventuellement du contenu de la mémoire (physique) au chargement du programme et du mode de fonctionnement du chargeur...bref : tu ne peux pas prouver que la valeur de n sera forcément très grande sans rien préciser d'autre (cf. message de Médinoc) [1].
    D'ailleurs, tu le dis presque toi-même :
    Citation Envoyé par Stupeflip
    une valeur aléatoire très grande
    Si elle est aléatoire : comment peux-tu savoir qu'elle sera très grande ?

    Cordialement,
    DS.

    [1] - Je viens de faire un essai avec gcc-3.4.4 (option -Os) sous XP-SP1 sur un x86 32 bits et le bout de code que tu m'as donné a affiché "2" 20 fois de suite (je n'ai pas essayé plus longtemps) : la valeur n'était donc ni grande ni aléatoire.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par David.Schris
    Je viens de faire un essai avec gcc-3.4.4 (option -Os) sous XP-SP1 sur un x86 32 bits et le bout de code que tu m'as donné a affiché "2" 20 fois de suite (je n'ai pas essayé plus longtemps) : la valeur n'était donc ni grande ni aléatoire.
    Elle est tout simplement indéterminée.
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    merci a tous pour votre aide.
    pour n en fait je l'ai initialisé avec un scanf("%d",&n) dans le main et a la compilation il me trouve aucune erreur !!!

    mais quand je l'execute la fenetre s'ouvre et message d'erreur !

    Mais j'ai fini par trouvé, et merci beaucoup de votre aide à tous. +++

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Elle est tout simplement indéterminée.
    cf. http://www.developpez.net/forums/sho...97&postcount=4 : ce n'est pas parce-que j'essaye d'expliquer quelque chose avec des mots différents (et peut-être moins exacts) que je n'ai pas compris ce que j'ai déjà écrit dans une de mes messages précédents
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pedro134
    pour n en fait je l'ai initialisé avec un scanf("%d",&n) dans le main et a la compilation il me trouve aucune erreur !!!
    Si tu ne montres pas tout le code pertinent, on ne pas faire de commentaires exacts...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. [SNMP] Problème de requêtes sous Windows
    Par weib dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 30/11/2005, 19h00
  2. Problème pare-feu sous Windows
    Par colomban dans le forum Sécurité
    Réponses: 3
    Dernier message: 30/09/2005, 09h50
  3. [TP7] Problème de OutTextXY sous Windows XP
    Par Trash_men dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 03/09/2005, 18h29
  4. [PostGres] Problème installation PostGres sous Windows
    Par Torpille dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 27/08/2004, 16h05
  5. [Débutant] Problème d'installation sous Windows 2000
    Par bavmorda dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 04/08/2004, 16h28

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