Problemme sur fonction [debutant]

Problemme sur fonction [debutant] - C - Programmation

Marsh Posté le 23-03-2007 à 19:21:44    

Bonjour à tous les programmeurs C, j'ai un problemme avec mon programme, il affiche une erreur mais je ne sais pas de quoi comme problemme. Si parmi vous il y a un bon coeur qui veut me donner une astuce ce sera tres gentil.
Voici mon code et l'enoncé.
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <alloc.h>
  4. /*************************************************************************************************************************************
  5. * Enoncé:                                                                                                                           *
  6. * Faire un programme avec le prototype suivant:                                                                                     *
  7. * AddFloatToVect(float f, float *fVect, int iElem) qui permettre d'ajouter un meme nombre à tout les elements d'un tableau.         *
  8. /*************************************************************************************************************************************/
  9. /**************************************
  10. *             PROTOTYPES             *
  11. /**************************************/
  12. float AddFloatToVect(float fNbr, float *pVect, int iElem);
  13. /**************************************
  14. *             PROG. MAIN             *
  15. /**************************************/
  16. int main (void)
  17. {
  18.   /* Declaration */
  19.    float pVect;
  20.    int iElem = 0;
  21.   /* Donnees en entrees */
  22.    float fNbr;
  23.   /* Traitement */
  24.    printf("Definir la taille d'element: " );
  25.    scanf("%d",&iElem);
  26.    printf("Saisie d'un nombre: " );
  27.    scanf("%f",&fNbr);
  28.    pVect = new float[iElem];
  29.    delete[] fVect;
  30. }
  31. /**************************************
  32. *              FONCTIONS             *
  33. /**************************************/
  34. float AddFloatToVect(float fNbr, float *pVect, int iElem)
  35. {
  36.   int iI;
  37.   for (iI=0; iI<iElem; iI++)
  38.      {
  39.       pVect[iI] = fNbr;
  40.      }
  41. return(pVect);
  42. }

 

Merci d'avance  :)

Reply

Marsh Posté le 23-03-2007 à 19:21:44   

Reply

Marsh Posté le 23-03-2007 à 19:34:59    

asie a écrit :

Bonjour à tous les programmeurs C, j'ai un problemme avec mon programme, il affiche une erreur mais je ne sais pas de quoi comme problemme. Si parmi vous il y a un bon coeur qui veut me donner une astuce ce sera tres gentil.
Voici mon code et l'enoncé.
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <alloc.h>
  4. /*************************************************************************************************************************************
  5. * Enoncé:                                                                                                                           *
  6. * Faire un programme avec le prototype suivant:                                                                                     *
  7. * AddFloatToVect(float f, float *fVect, int iElem) qui permettre d'ajouter un meme nombre à tout les elements d'un tableau.         *
  8. /*************************************************************************************************************************************/
  9. /**************************************
  10. *             PROTOTYPES             *
  11. /**************************************/
  12. float AddFloatToVect(float fNbr, float *pVect, int iElem);
  13. /**************************************
  14. *             PROG. MAIN             *
  15. /**************************************/
  16. int main (void)
  17. {
  18.   /* Declaration */
  19.    float pVect;
  20.    int iElem = 0;
  21.   /* Donnees en entrees */
  22.    float fNbr;
  23.   /* Traitement */
  24.    printf("Definir la taille d'element: " );
  25.    scanf("%d",&iElem);
  26.    printf("Saisie d'un nombre: " );
  27.    scanf("%f",&fNbr);
  28.    pVect = new float[iElem];
  29.    delete[] fVect;
  30. }
  31.  
  32. /**************************************
  33. *              FONCTIONS             *
  34. /**************************************/
  35. float AddFloatToVect(float fNbr, float *pVect, int iElem)
  36. {
  37.   int iI;
  38.   for (iI=0; iI<iElem; iI++)
  39.      {
  40.       pVect[iI] = fNbr;
  41.      }
  42. return(pVect);  
  43. }


 
Merci d'avance  :)


 
Plusieurs problèmes dans ce code
1) pVect étant sensé être un tableau (ou un pointeur vers une zone mémoire allouée pour l'occasion ce qui revient au même qu'un tableau), il s'ensuit qu'il ne peut pas être de type "float" mais "float *"
2) les opérateurs "new" et "delete" sont des opérateurs de C++ et non de C. Si tu compiles ton code avec un compilo C, il est normal qu'il gueule. Remplace "pVect = new float[iElem]" par "pVect=malloc(iElem * sizeof(float))" et "delete[] pVect" par "free(pVect)"
3) ta fonction "addFloatToVect" renvoie pVect. C'est quoi "pVect" ? C'est un "float *". Donc ta fonction est de type "float *" et non "float" !!!
 
Je crois que c'est tout. Faudra quand-même que tu nous dises à quoi sert la fonction "addFloatToVect" qui est créée mais non utilisée...


Message édité par Sve@r le 23-03-2007 à 19:38:32

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-03-2007 à 19:52:45    

La fonction AddFloatToVect sert à ajouter un même nombre à tout les éléments d'un vecteur.
PS: Merci Sve@r.

Reply

Marsh Posté le 23-03-2007 à 20:15:50    

asie a écrit :

La fonction AddFloatToVect sert à ajouter un même nombre à tout les éléments d'un vecteur.
PS: Merci Sve@r.


J'avais compris. Mais comme elle n'est pas utilisée... Au fait, pourquoi elle renvoie un "float *" ? A quoi te servira cette valeur renvoyée dans l'appelant ?
A mon avis, tu peux la mettre de type "void" sans soucis...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-03-2007 à 20:54:56    

si tu fais  

Code :
  1. pVect[iI] = fNbr;


 
tu vas remplacer la valeur de ton vecteur par fNbr. Si tu souhaites l'ajouter, fais plutot :  
 

Code :
  1. pVect[iI] += fNbr;


 
 
Ton code ici présente une erreur et est inutile (en plus du fait qu'on n'utilise pas new et delete en C comme l'a expliqué sve@r.
 

Code :
  1. #
  2. pVect = new float[iElem];
  3. #
  4.   delete[] fVect;


 
ce n'est pas fVect, mais pVect. De plus, pVect est de type float, or il devrait être de type float *.  
Tu alloues de la mémoire, puis tu la désalloues juste derrière. Ca ne sert à rien, il faut au moins faire des choses entre les 2. Peut-être ton code n'est pas complet ? Tu peux appeler ta fonction AddFloatToVect après ton allocation par exemple. Mais n'oublie pas que dès que du désalloues, tu ne pourras plus accéder à cette mémoire allouée.

Reply

Marsh Posté le 24-03-2007 à 01:45:14    

asie a écrit :

Bonjour à tous les programmeurs C, j'ai un problemme avec mon programme,  

Code :
  1. pVect = new float[iElem];
  2.    delete[] fVect;




Tu m'étonnes...
 
Alors C ou C++ ?
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-03-2007 à 08:39:29    

Emmanuel Delahaye a écrit :

Tu m'étonnes...

 

Alors C ou C++ ?


 
Je sais, j'ai beaucoup fais des erreurs veuillez m'excusez pour tous mes erreurs  :jap: .
j'ai reussi à resoudre mes erreurs "grace à vous" mais il y a queque chose que je ne comprendre pas. Vous-voulez bien m'expliquer S.V.P, voici mon code

 

 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <alloc.h>
  4. /*************************************************************************************************************************************
  5. * Enoncé:                                                                                                                                                                *
  6. * Faire un programee avec les prototypes suivants:                                                                                                         *
  7. * AddFloatToVect(float f, float *fVect, int iElem) qui permettre d'ajouter un meme nombre à tout les elements d'un tableau.         *
  8. *************************************************************************************************************************************/
  9. /**************************************
  10. *             PROTOTYPES                                  *
  11. **************************************/
  12. void AddFloatToVect(float fNbr, float *pVect, int iElement);
  13. /**************************************
  14. *             PROG. MAIN                                    *
  15. **************************************/
  16. int main (void)                             
  17. {
  18.   /* Declaration */
  19.    float *pVect=0;
  20.    int iElement = 0;
  21.    int iI;
  22.   /* Donnees en entrees */
  23.    float fNbr;
  24.   /* Traitement */
  25.    printf("Definir la taille d'element: " );
  26.    scanf("%d",&iElement);
  27.    printf("Saisie d'un nombre: " );
  28.    scanf("%f",&fNbr);
  29.    pVect = (float *)malloc(iElement * sizeof(float));   //Creation du tableau dans un malloc et met dans pVect
  30.    AddFloatToVect(fNbr, pVect, iElement);
  31.    /* Affichage des elements du tableau */
  32.    for (iI=0;iI<iElement;iI++)
  33.       {
  34.        printf("element du tab[%d]= %lf\n",iI,pVect[iI]);
  35.       } 
  36. }
  37. /**************************************
  38. *              FONCTIONS             *
  39. **************************************/
  40. void AddFloatToVect(float fNbr, float *pVect, int iElement)
  41. {
  42.   int iI;
  43.   for (iI=0; iI<iElement; iI++)
  44.      {
  45.       pVect[iI] += fNbr;
  46.      }
  47. }

 

dans la partie de l'appele "AddFloatToVect(fNbr,pVect,iElement); je n'ai pas indiqué le type de chaque variable dans le parametre et si je les mis il affiche une erreur, pourquoi? Expliquer moi S.V.P.

Reply

Marsh Posté le 24-03-2007 à 09:58:37    

asie a écrit :

dans la partie de l'appele "AddFloatToVect(fNbr,pVect,iElement); je n'ai pas indiqué le type de chaque variable dans le parametre et si je les mis il affiche une erreur, pourquoi? Expliquer moi S.V.P.


Quand on appelle une fonction, on lui donne juste le ou les paramètres (ou valeurs) qui seront passés à la fonction. La fonction reçoit ces valeurs et les stocke dans des variables du type qui est précisé dans les paramètres.
Mais t'as pas besoin de préciser ces types lors de l'appel. D'ailleurs, quand tu appelles "printf()", tu ne précises pas lors de l'appel quel est le type de valeur que tu lui passes ? Tu le lui passes et puis c'est tout. printf() se débrouille par lui-même...
 
Donc ta fonction "AddFloatToVect()" doit recevoir comme premier paramètre un "float". Tu lui passes "fNbr" qui est "float" donc pas de problème. La fonction reçoit la valeur de "fNbr" (du main) et la stocke dans une seconde variable nommée aussi "fNbr" (mais tu aurais pu aussi l'appeler "toto" car cette variable n'est connue que de ta fonction) de type "float". Et ce principe s'applique à tout paramètre de toute fonction en C.
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-03-2007 à 10:12:22    

Voilà, j'ai terminé mon code et j'ajoute quelque prototype.
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <alloc.h>


/*************************************************************************************************************************************
 * Enoncé:                                                                                                                                                                *
 * Faire un programee avec les prototypes suivants:                                                                                                         *
 * AddFloatToVect(float f, float *fVect, int iElem) qui permettre d'ajouter un meme nombre à tout les elements d'un tableau.         *
 * MultipleVectByFloat() qui permettre de multiplier tous les elements d'un vecteur.                                                                 *
 * VectSumElem() qui permettre d'additionner des éléments d'un vecteur et renvoie la somme des éléments d'un vecteur.              *
 * VectSumSquarElem() qui permettre de faire la somme des carres des elements d'un tableau.                                                 *
 * ShowElemVect(float *pVect, int iElement) affichage des éléments d'un vecteur.                                                                  *
 *************************************************************************************************************************************/
/**************************************
 *             PROTOTYPES                                  *
 **************************************/
 void  AddFloatToVect(float fNbr, float *pVect, int iElement);
 void  MultipleVectByFloat(float fNbr, float *pVect, int iElement);
 float VectSumElem(float *pVect, int iElement);
 float VectSumSquarElem(float *pVect, int iElement);
 void  ShowElemVect(float *pVect, int iElement);

 

/**************************************
 *             PROG. MAIN                                    *
 **************************************/
 int main (void)                              
 {
  /* Declaration */
   float *pVect=0;
   int iElement = 0;
   float fSomme;
   float fSommeCarree;
  /* Donnees en entrees */
   float fNbr;
  /* Traitement */
   printf("Definir la taille d'element: " );
   scanf("%d",&iElement);
   printf("Saisie d'un nombre: " );
   scanf("%f",&fNbr);
 
   pVect = (float *)malloc(iElement * sizeof(float));   //Creation du tableau dans un malloc et met dans pVect
 
   AddFloatToVect(fNbr, pVect, iElement);
   ShowElemVect(pVect, iElement);    // Affichage des éléments d'un vecteur
   printf("\nSaisie d'un nombre pour multiplier des éléments d'un vecteur: " );
   scanf("%f",&fNbr);
   MultipleVectByFloat(fNbr, pVect, iElement);
   ShowElemVect(pVect, iElement);    // Affichage des éléments d'un vecteur
   fSomme = VectSumElem(pVect, iElement);
   printf("\nRésultats d'additionne des éléments d'un vecteur: %f\n", fSomme);
   fSommeCarree = VectSumSquarElem(pVect, iElement);
   printf("Résultats somme des carrées: %f", fSommeCarree);
   
   free(pVect);
}
/**************************************
 *              FONCTIONS             *
 **************************************/
void AddFloatToVect(float fNbr, float *pVect, int iElement)
{
  int iI;
  for (iI=0; iI<iElement; iI++)
     {
      pVect[iI] += fNbr;
     }
}
/****************************************************************/
void MultipleVectByFloat(float fNbr, float *pVect, int iElement)
{
 int iI;
 for (iI=0; iI<iElement; iI++)
    {
     pVect[iI] *= fNbr;
    }
}
/*****************************************************************/
float VectSumElem(float *pVect, int iElement)
{
 int iI;
 float fSomme = 0;
 for (iI=0; iI<iElement; iI++)
    {
     fSomme += *(pVect +1);
    }
 return(fSomme);
}
/*****************************************************************/
float VectSumSquarElem(float *pVect, int iElement)
{
 int iI;
 float fSomCarree = 0;
 for (iI=0; iI<iElement; iI++)
    {
     pVect[iI] = *(pVect +1) * *(pVect +1);
     fSomCarree += pVect[iI];
    }
 return(fSomCarree);
}
/*****************************************************************/
void ShowElemVect(float *pVect, int iElement)
{
 int iI;
 for (iI=0; iI<iElement; ++iI)
    {
     printf("Elément du Tab[%d] = %f\n",iI+1, *(pVect +1));
    }
}
Merci à vous tous specialement à Sve@r de m'avoir aider.  :hello:  à bientot.

 

Reply

Marsh Posté le 25-03-2007 à 13:01:49    

asie a écrit :

Code :
  1. /*****************************************************************/
  2. float VectSumElem(float *pVect, int iElement)
  3. {
  4. int iI;
  5. float fSomme = 0;
  6. for (iI=0; iI<iElement; iI++)
  7.     {
  8.      fSomme += *(pVect +1);
  9.     }
  10. return(fSomme);
  11. }
  12. /*****************************************************************/
  13. float VectSumSquarElem(float *pVect, int iElement)
  14. {
  15. int iI;
  16. float fSomCarree = 0;
  17. for (iI=0; iI<iElement; iI++)
  18.     {
  19.      pVect[iI] = *(pVect +1) * *(pVect +1);
  20.      fSomCarree += pVect[iI];
  21.     }
  22. return(fSomCarree);
  23. }
  24. /*****************************************************************/
  25. void ShowElemVect(float *pVect, int iElement)
  26. {
  27. int iI;
  28. for (iI=0; iI<iElement; ++iI)
  29.     {
  30.      printf("Elément du Tab[%d] = %f\n",iI+1, *(pVect +1));
  31.     }
  32. }



 
Hum... si tu utilises à chaque fois "pVect + 1" dans ta boucle, tu ne traiteras pas les "n" éléments de ton tableau mais "n" fois le même élément. Peut-être voulais-tu écrire "*(pVect + iI)" ???
Par ailleurs, bien que "*(pVect + iI)" soit correct, t'as aussi le droit de l'écrire "pVect[iI]". C'est plus lisible et tout aussi rapide à l'exécution.
Sinon ta fonction "VectSumSquarElem" est mal conçue. Son rôle est de renvoyer la somme des carrés mais pas de modifier le contenu du tableau. Or, toi tu écris "pVect[iI] = *(pVect +1) * *(pVect +1);" => il y a affectation donc modification !!!


Message édité par Sve@r le 25-03-2007 à 13:04:42

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-03-2007 à 13:01:49   

Reply

Marsh Posté le 25-03-2007 à 14:18:01    

Encore merci Sve@r.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed