Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1361 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Appel de procédure : variable non renvoyée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Appel de procédure : variable non renvoyée

n°2113447
Benh_31
Posté le 27-11-2011 à 16:10:37  profilanswer
 

Bonjour à tous ! je suis en 1ere année en IUT informatique et voila mon problème :
on est en train d'apprendre à se servir des sous programmes et des procédures.
je dois faire un sous programme qui calcule le minimum, le maximum et la moyenne des éléments d'un tableau, pour le moment pas de problème, mais je n'arrive pas à renvoyer mes résultats dans mon programme principal :( une idée ?
 
procédure :

Code :
  1. void minMaxMoy(int pNbelt,const float ptabVal[],float pMin, float pMax,float pMoy)
  2. {
  3.     int i;
  4.     float pSom;
  5.     //calcul du min et du max
  6.     pMin=ptabVal[0];
  7.     pMax=ptabVal[0];
  8.     for(i=1;i<pNbelt;i++)
  9.     {
  10.         if(ptabVal[i]<pMin)
  11.         {
  12.             pMin=ptabVal[i];
  13.         }
  14.         if(ptabVal[i]>pMax)
  15.         {
  16.             pMax=ptabVal[i];
  17.         }
  18.     }
  19.     //calcul de la somme puis de la moyenne
  20.     pSom=0;
  21.     for(i=0;i<pNbelt;i++)
  22.     {
  23.         pSom=pSom+ptabVal[i];
  24.     }
  25.     pMoy=pSom/pNbelt;
  26. }


 
 
programme principal :
 

Code :
  1. int main(void)
  2. {
  3.    float tabTemps[KNBCOURMAX] ; // stocke les temps saisis relatifs à chaque coureur
  4.    int nbCour ; //compteur, nombre de coureurs
  5.    float min; // meilleur temps
  6.    float max; // temps le plus mauvais
  7.    float moy; // moyenne des temps
  8. minMaxMoy(nbCour,tabTemps,min,max,moy);
  9. printf("\nLe meilleur temps est : %f\nLe plus mauvais temps est : %f\nLa moyenne des temps est : %f",min, max, moy);
  10. }
  11. return 0;


 
il y a peu être des trucs qui servent à rien ou en trop , j'ai sélectionné le bout de programme qui pose problème, le tableau a été rentré avant, le minimum, le maximum et la moyenne sont correctement calculé dans le sous programme c'est juste pour les renvoyer que j'ai un problème
 
merci d'avance pour votre aide !
 
 

mood
Publicité
Posté le 27-11-2011 à 16:10:37  profilanswer
 

n°2113504
hoov
Posté le 28-11-2011 à 00:36:45  profilanswer
 

Salut,

 

Utilise des pointeurs pour les valeurs retournées.

n°2113516
Benh_31
Posté le 28-11-2011 à 08:42:58  profilanswer
 

Arg :s on l'a pas encore vus mais j'ai trouvé mon problème : il manquait les "&" après les floats dans la déclaration de la procédure :)


Message édité par Benh_31 le 28-11-2011 à 09:46:31
n°2113561
404 Not Fo​und
Posté le 28-11-2011 à 13:23:17  profilanswer
 

Tu apprends la programmation ou l'alchimie ? [:404 not found:3]  
 
http://hfr-rehost.net/imgs.xkcd.com/comics/pointers.png

n°2113564
Benh_31
Posté le 28-11-2011 à 13:53:24  profilanswer
 

j'ai pas compris la :s

n°2113699
404 Not Fo​und
Posté le 28-11-2011 à 19:02:02  profilanswer
 

Renseigne-toi sur la signification des "&" que tu as ajouté ;)

n°2114361
flaschgord​on
Posté le 01-12-2011 à 22:01:39  profilanswer
 

Moi aussi je suis en IUT informatique je vais essayer de te montrer un peu tes erreurs mais ne prend pas ça pour acquis  
 
 

Code :
  1. void minMaxMoy(int pNbelt,const float ptabVal[],float pMin, float pMax,float pMoy)
  2.     {
  3.         int i;
  4.         float pSom;
  5.         //calcul du min et du max
  6.         pMin=ptabVal[0];
  7.         pMax=ptabVal[0];
  8.         for(i=1;i<pNbelt;i++)
  9.         {
  10.             if(ptabVal[i]<pMin)
  11.             {
  12.                 pMin=ptabVal[i];
  13.             }
  14.             if(ptabVal[i]>pMax)
  15.             {
  16.                 pMax=ptabVal[i];
  17.             }
  18.         }
  19.         //calcul de la somme puis de la moyenne
  20.         pSom=0;
  21.         for(i=0;i<pNbelt;i++)
  22.         {
  23.             pSom=pSom+ptabVal[i];
  24.         }
  25.         pMoy=pSom/pNbelt;
  26.     }


 
Pour commencer petite partie de Cours : Une procédure qui renvoie un résultat s'appelle une "Fonction" soit relis bien la fonction MinMaxMoy que tu as fait tout Pour commencer le type de la fonction soit "Void" n'est pas bon car si tu veut renvoyer un resultat tu ne créer pas une fonction qui n'en renvoient pas Void permet est un type qui ne renvoient rien si je peut l'expliquer comme ca  
 
De plus relis le cours sur les fonctions a l'occasion , toute fonction retourne un résultat  
D'ou l'utilisation de la syntaxe suivante  

Code :
  1. Return "le resultat que tu veux retourner"


en l'occurence

Code :
  1. Return pSom ;

(je n'en suis pas sur car ton programme est un peu compliqué a lire)
 
Pour continuer et j’espère ne pas te dire de bêtise  
tu déclare dans ta fonction  
int i ;
puis par la suite dans ton for tu redeclare i a 1
il n'est peut être donc pas utile de déclarer int i et éviter ainsi de surcharger ton programme  
 
Autre information il me semble que hoov a voulut faire passez c'est que si tu fait un passage de paramètre par valeur tu ne pourra pas changer les valeur de ton programme principale imaginons  

Code :
  1. Fonction Plus( int a)
  2. {
  3. a=a+1;
  4. return a ;
  5. }
  6. Programme  Principale
  7. int Nb =10;
  8. Plus(Nb) ;


Si tu fait cela Nb restera a 10 car le passage par valeur ne peut modifier la valeur declarer dans le programme principe
 c'est encore du cours , pour cela il faut donc utiliser un passage de paramétre soit par référence soit par adresse ( pointeur) après si vous ne l'avez pas fait effectivement c'est pas simple.
 
J'espere t'avoir aider  
 
PS : c'est du C++ que j'ai mis n'ayant pas encore trop bucher sur du C peut etre que des choses différent  
 
Voila bien sur je peut me tromper je suis étudiant tout comme toi donc soit indulgent :)
au plaisir  

n°2114613
Terminapor
I'll see you rise.
Posté le 02-12-2011 à 23:35:18  profilanswer
 

si c'est du CPP, fais passer tes résultats max / min / moy par reference avec le '&' dans le prototype, là tu fais passer par copie.
Sinon, en C, je dirais pointeurs

 

edit : Houlà, avait pas vu l'espèce de petit déterrage de topic résolu. :o

 

Bon sinon, t'es pas forcément obligé d'utiliser un return pour renvoyer une valeur. si tu passes par pointeur, tu modifie direct la valeur dans la case mémoire, pour reprendre ton exemple :

Code :
  1. void plus(int *a)
  2. {
  3. // On accède à la valeur à l'adresse 'a' via le * et on incrémente de 1
  4. (*a)+=1;
  5. }


et dans le main

Code :
  1. int main()
  2. {
  3. int val=10;
  4. plus(&val); // le '&' permet d'envoyer l'adresse de la variable 'val' dans ce cas
  5. }
 

Mais pour du C++, faut faire passer par reference, c'est plus sûr. :o


Message édité par Terminapor le 02-12-2011 à 23:39:01

---------------
Perhaps you don't deserve to breathe
n°2114614
gilou
Modérateur
Modzilla
Posté le 03-12-2011 à 00:34:07  profilanswer
 

Benh_31 a écrit :

Bonjour à tous ! je suis en 1ere année en IUT informatique et voila mon problème :
on est en train d'apprendre à se servir des sous programmes et des procédures.
je dois faire un sous programme qui calcule le minimum, le maximum et la moyenne des éléments d'un tableau, pour le moment pas de problème, mais je n'arrive pas à renvoyer mes résultats dans mon programme principal :( une idée ?
 
procédure :

Code :
  1. void minMaxMoy(int pNbelt,const float ptabVal[],float pMin, float pMax,float pMoy)


 
il y a peu être des trucs qui servent à rien ou en trop , j'ai sélectionné le bout de programme qui pose problème, le tableau a été rentré avant, le minimum, le maximum et la moyenne sont correctement calculé dans le sous programme c'est juste pour les renvoyer que j'ai un problème
 
merci d'avance pour votre aide !
 
 

C'est pas mal ce que tu as fait. A l'oubli des & devant les paramètres près.
Tu pouvais tout faire en une seule boucle.
Attention néanmoins à tester les cas limites des paramètres en entrée, ici, il faut pNbelt > 0, sinon on va au devant de problèmes.
 

Code :
  1. void minMaxMoy(int pNbelt, const float ptabVal[], float& pMin, float& pMax, float& pMoy) {
  2.    if (pNbelt < 1) {
  3.         std::cerr << "ERREUR: Nb d'elements du tableau incorrect. Fin du programme!" << std::endl;
  4.         exit(1);
  5.    }
  6.  
  7.    pMoy = 0;
  8.    pMin = pMax = ptabVal[0];
  9.    for (int i = 0; i < pNbelt; ++i) {
  10.         pMoy += ptabVal[i];
  11.         if (ptabVal[i] < pMin)  { pMin = ptabVal[i]; }
  12.         if (ptabVal[i] > pMax)  { pMax = ptabVal[i]; }
  13.     }
  14.    pMoy /= pNbelt;
  15. }


Dernier point, n’hésites pas à utiliser des espaces, ça rend le code bien plus lisible (if (ptabVal[i] < pMin) plutôt que if(ptabVal[i]<pMin) par exemple).
 
Remarque: Bien que tu n'aies pas vu les pointeurs, il yen a un caché ici:
void minMaxMoy(int pNbelt, const float ptabVal[], float& pMin, float& pMax, float& pMoy)  
signifie en fait
void minMaxMoy(int pNbelt, const float *ptabVal, float& pMin, float& pMax, float& pMoy)  
Malgré ce que l'écriture laisse croire, quand on a un paramètre avec [], ce n'est pas une table que l'on passe, mais en fait un pointeur.
 
A+,


Message édité par gilou le 03-12-2011 à 01:35:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Appel de procédure : variable non renvoyée

 

Sujets relatifs
Variable tableau / Range("A1:A" & i) = montab - ne fonctionne pasProcédure d'installation sur windows
[PL/SQL] Erreur création procédureespaces dans valeurs variable bloque appel à la fonction ?
Récuperer tous les index d'un array dans 1 variableprocédure click
problème pour ajouter un nombre à une variable (heure UTC et CEST)Lire dans un fichier puis associer une variable à chaque ligne
[VBS] associer le stout d'une commande à une variable 
Plus de sujets relatifs à : Appel de procédure : variable non renvoyée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR