Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre à l'essai
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 21
    Points
    21

    Par défaut Erreur fonction simple

    Bonjour,
    je débute dans le langage C et je ne comprend pas pourquoi le programme suivant:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
     
    void calculeraire (double r, double a){
      a = M_PI*r*r;
    }
     
    int main () {
      double rayon = 1.5,aire;
      calculeraire (rayon,aire);
      printf ("Aire = %f\n",aire);
      return EXIT_SUCCESS;
    }
    ne marche pas après compilation : gcc -Wall aire.c -o aire
    En effet quand je l'appelle, le message suivant apparaît:

    aire.c: In function âmainâ:
    aire.c:11:16: attention : âaireâ is used uninitialized in this function [-Wuninitialized]

    Pourtant, dans le main calculeraire s'applique à 1.5 et aire et suite à l'appel de calculeraire (1.5,aire), aire va contenir M_PI*1.5*1.5 ?
    Merci.

  2. #2
    Membre Expert
    Avatar de azstar
    Homme Profil pro Abdou azstar
    Ingénieur Consultant .NET
    Inscrit en
    juillet 2008
    Messages
    1 160
    Détails du profil
    Informations personnelles :
    Nom : Homme Abdou azstar
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur Consultant .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2008
    Messages : 1 160
    Points : 2 296
    Points
    2 296

    Par défaut

    le variable aire n"est initialiser
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
     
    void calculeraire (double r, double &a){
      a = M_PI*r*r;
    }
     
    int main () {
      double rayon = 1.5,aire=1.5;
      calculeraire (rayon,aire);
      printf ("Aire = %f\n",aire);
      return EXIT_SUCCESS;
    }
    NB: on est pas sur le forum C ,voila le lien vers forum C
    Si tu aimes ma Réponse pense à cliquer sur

    Voir mon blog

  3. #3
    Membre habitué Avatar de zhouyu
    Homme Profil pro Loïc
    Étudiant
    Inscrit en
    octobre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2009
    Messages : 87
    Points : 129
    Points
    129

    Par défaut

    En effet tu ne passais pas ton paramètre 'a' par référence ou pointeur du coup quand tu appellais la fonction il ne modifiait pas le paramètre.

  4. #4
    Membre à l'essai
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 21
    Points
    21

    Par défaut

    Rebonjour,
    ma variable aire est initialisée dans le main (?): double aire.
    Faut-il l'initialiser avec une valeur quelconque comme 1.5 ?
    Je ne comprends pas non plus pourquoi passer en argument &a dans calculeraire, c'est-à-dire l'adresse de la variable a.
    Ce ne serait pas plutôt *a, c'est-à-dire le contenu de la variable pointé par a qu'il faudrait passer en argument?
    Et dernière question: le fait d'écrire a = M_PI*r*r, ça veut dire que dans le contenu de a, on met M_PI*r*r, donc on modifie la variable a et dc pourquoi s'embêter avec les * et & ?

    Merci.
    PS: ok à l'avenir je ne confondrais plus C# et C

  5. #5
    Membre habitué Avatar de zhouyu
    Homme Profil pro Loïc
    Étudiant
    Inscrit en
    octobre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2009
    Messages : 87
    Points : 129
    Points
    129

    Par défaut

    Par défaut les variables sont passé par copie.
    Donc quand tu appelles ta fonction :

    Code :
    1
    2
    3
    void calculeraire (double r, double a){
      a = M_PI*r*r;
    }
    il copie ton 'a' et lui assigne M_PI*r*r

    Mais celui que tu as donné en paramètre lui n'est pas modifié.
    Pour modifier le paramètre il faut soit le passer via les pointeur car tu lui donneras l'adresse mémoire de ton paramètre.
    Ex :
    Code :
    1
    2
    3
    void calculeraire (double r, double *a){
      *a = M_PI*r*r;
    }
    Ou alors par référence, c'est le même principe mais un peu caché ^^ il récupère l'adresse de la variable mais ça s'utilise "normalement".
    Ex:
    Code :
    1
    2
    3
    void calculeraire (double r, double &a){
      a = M_PI*r*r;
    }
    L'erreur que tu avais était justement que tu n'initialisais pas aire :
    Code :
    double rayon = 1.5,aire;
    Et ta fonction ne modifiait pas non plus la variable donc tu faisais un printf sur une variable non initialisée .
    Essaie de toujours initialiser tes variables, en général on met 0 si tu ne connais pas sa valeur à la déclaration.

  6. #6
    Membre à l'essai
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 21
    Points
    21

    Par défaut

    Ok j'ai compris!
    Merci!

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •