Problemme sur fonction [debutant] - C - Programmation
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.
|
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...
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.
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. |
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...
Marsh Posté le 23-03-2007 à 20:54:56
si tu fais
Code :
|
tu vas remplacer la valeur de ton vecteur par fNbr. Si tu souhaites l'ajouter, fais plutot :
Code :
|
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 :
|
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.
Marsh Posté le 24-03-2007 à 01:45:14
asie a écrit : Bonjour à tous les programmeurs C, j'ai un problemme avec mon programme,
|
Tu m'étonnes...
Alors C ou C++ ?
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 .
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 :
|
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.
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.
Marsh Posté le 25-03-2007 à 10:12:22
Voilà, j'ai terminé mon code et j'ajoute quelque prototype.
Code :
|
/*************************************************************************************************************************************
* 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. à bientot.
Marsh Posté le 25-03-2007 à 13:01:49
asie a écrit :
|
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 !!!
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é.
Merci d'avance