Précédent   Forum du club des développeurs et IT Pro > Dotnet > Langages > C#
C# Forum d'entraide sur la programmation C#. Avant de poster -> FAQ C#, Articles C#, Sources C#
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/12/2012, 16h09   #1
Glork
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 34
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 34
Points : 11
Points : 11
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.
Glork est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 18h11   #2
azstar
Membre Expert
 
Avatar de azstar
 
Homme azstar
Ingénieur Consultant DOTNET
Inscription : juillet 2008
Messages : 865
Détails du profil
Informations personnelles :
Nom : Homme azstar
Localisation : Maroc

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

Informations forums :
Inscription : juillet 2008
Messages : 865
Points : 1 265
Points : 1 265
Envoyer un message via MSN à azstar Envoyer un message via Yahoo à azstar
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
azstar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 23h03   #3
zhouyu
Membre habitué
 
Avatar de zhouyu
 
Homme Loïc
Étudiant
Inscription : octobre 2009
Messages : 83
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2009
Messages : 83
Points : 129
Points : 129
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.
zhouyu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 19h11   #4
Glork
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 34
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 34
Points : 11
Points : 11
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
Glork est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 22h05   #5
zhouyu
Membre habitué
 
Avatar de zhouyu
 
Homme Loïc
Étudiant
Inscription : octobre 2009
Messages : 83
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2009
Messages : 83
Points : 129
Points : 129
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.
zhouyu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/01/2013, 20h58   #6
Glork
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 34
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 34
Points : 11
Points : 11
Ok j'ai compris!
Merci!
Glork est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h44.


 
 
 
 
Partenaires

Hébergement Web