Type de variable incompatible...langage C

lagarkane -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour bonjour!

voilà, je me retrouve face à un probleme sur lequel je plonge depuis plus de 2heures maintenant....

j'ai fait un appel à une fonction "moyenneTableau", qui est censé me faire la moyenne des 4nombres de mon tableau, en récupérant le pointeur "addition", dans lequel est stocké l'adresse de la variable contenant l'addition des 4chiffres du tableau...

lorsque j'appelle ma fonction "moyenneTableau", qui est de type double, puisqu'une moyenne peut afficher un nombre décimal, je lui donne en parametre les informations suivantes:

-le pointeur additionet le nombre de chiffres de mon tableau en type "int", pour qu'il puisse faire la moyenne;
-et je lui donne également le pointeur "moyenne", de type "double", pour qu'il puisse me renvoyer le résultat à la fonction "main"
seulement il m'affiche le message suivant: error: incompatible type for argument 3 of 'moyenneTableau'

Je vous mets mon code:

#include <stdio.h>
#include <stdlib.h>

void afficheTableau(int tableau[], int *tailleTbl); //prototype
int sommeTableau(int tableau[], int *tailleTbl, int *addition);
double moyenneTableau(int *addition, int *tailleTbl, double *moyenne);

int main(int argc, char *argv[])
{
    int tableau[4] = {0, 15, 65};

    int additionDesNombres = 0;
    int tailleTableau = 0;
    double moyenneDesNombres = 0;

    int *addition = &additionDesNombres;
    int *tailleTbl = &tailleTableau;
    double *moyenne = &moyenneDesNombres;

    afficheTableau(tableau, 4);
    sommeTableau(tableau, 4, *addition);
    moyenneTableau(*addition, 4, *moyenne);

    return 0;
}

void afficheTableau(int tableau[], int *tailleTbl)
{
    int i;

    for (i = 0; i < *tailleTbl; i++)
    {
        printf("%d \n",tableau[i]);
    }
}

int sommeTableau(int tableau[], int *tailleTbl, int *addition)
{

    int i;
    for (i = 0; i < *tailleTbl; i++)
    {
        tableau[i];
        *addition = *addition + tableau[i];
    }
    printf("L'addition de ces %d nombres est: %d", *tailleTbl, *addition);
    return *addition;
}

double moyenneTableau(int *addition, int *tailleTbl, double *moyenne)
{
    *moyenne = *addition / *tailleTbl;
    printf("La moyenne des %d nombres est: %d", *tailleTbl, *moyenne);
    return *moyenne;
}


Vous comprendrez surement en voyant mon code, que je suis un débutant =P

Selon le tuto du siteduzero, une fonction peut utiliser autant de parametres qu'on veut bien y mettre, mais il n'était stipulé nulle part qu'il était impossible de mettres des parametres de types différent dans les parametres d'une même fonction...
donc pour moi le code me parait juste, mais ca a pas l'air d'être le cas pour ma machine ><

J'implore donc l'aide des grands maîtres de l'informatique ici présents, parce que là, je sèche U_u

Merci à vous d'avance =)
A voir également:

6 réponses

jacinthe87 Messages postés 194 Date d'inscription   Statut Membre Dernière intervention   3
 
Essai ce code:
#include <stdio.h>
#include <stdlib.h>


void afficherTableau(int *t,int dim);
int sommeTableau(int *t,int dim);
int moyenneTableau(int *t,int dim);
int i;
int main(int argc, char *argv[])
{
  int tab[4]={2,4,2,3};
 afficherTableau(tab,4);
 printf("La somme est : %d \n",sommeTableau(tab,4));
 printf("La moyenne est : %d \n",moyenneTableau(tab,4));
  system("PAUSE");	
  return 0;
}

void afficherTableau(int *t,int dim){
     for(i=0;i<dim;i++){
                   printf("%d \n",t[i]);
                   }
}
int sommeTableau(int *t,int dim){
    int somme=0;
    for(i=0;i<dim;i++){
                   somme+=t[i];
                   }
                   return somme;
}
int moyenneTableau(int *t,int dim){
    int moyenne=0;
    for(i=0;i<dim;i++){
                   moyenne=sommeTableau(t,i)/dim;
                   }
                   return moyenne;
}

0
ITACHI971 Messages postés 760 Date d'inscription   Statut Membre Dernière intervention   231
 
moi je vais mettre du temps à comprendre les pointeurs, j'en suis qu'au fonctions ><
0
bibliomax Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   3
 
salut Monsieur je suis désolé mais votre code n'est pas au niveau vous avez compliqué les choses
sinon voilà un code sans erreurs c'est le même j'ai seulement rectifié quelques fautes .



#include <stdio.h>
#include <stdlib.h>

void afficheTableau(int tableau[], int *tailleTbl); //prototype
int sommeTableau(int tableau[], int *tailleTbl, int *addition);
double moyenneTableau(int *addition, int *tailleTbl, double *moyenne);

int main(int argc, char *argv[])
{
int tableau[4] = {0, 15, 65};
int x=4;

int additionDesNombres = 0;
int tailleTableau = 0;
double moyenneDesNombres = 0;

int *addition = &additionDesNombres;
int *tailleTbl = &tailleTableau;
double *moyenne = &moyenneDesNombres;

afficheTableau(tableau, &x);
sommeTableau(tableau, &x, addition);
moyenneTableau(addition, &x, moyenne);

return 0;
}

void afficheTableau(int tableau[], int *tailleTbl)
{
int i;

for (i = 0; i < *tailleTbl; i++)
{
printf("%d \n",tableau[i]);
}
}

int sommeTableau(int tableau[], int *tailleTbl, int *addition)
{

int i;
for (i = 0; i < *tailleTbl; i++)
{
tableau[i];
*addition = *addition + tableau[i];
}
printf("L'addition de ces %d nombres est: %d", *tailleTbl, *addition);
return *addition;
}

double moyenneTableau(int *addition, int *tailleTbl, double *moyenne)
{
*moyenne = *addition / *tailleTbl;
printf("La moyenne des %d nombres est: %f", *tailleTbl, *moyenne);
return *moyenne;
}



j'ai une question ...
vous faites l'informatique à l'école ou vous êtes autodidacte ????
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
*moyenne = *addition / *tailleTbl;
Attention, *addition et *tailleTbl sont des entiers. Ainsi leur division donnera un résultat en entier et non la valeur attendue. Pour cela il faut caster l'un des deux entiers en double.

Cdlt
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,

Tu utilises des pointeurs alors que tu n'en as pas besoin dans ce cas. Lorsque tu souhaites modifier un argument dans la fonction appelée, tu passes par pointeur, sinon tu oublies le pointeur (sauf cas particulier comme gestion de la mémoire pour les structures, ...).

De plus attention à la taille de ton tableau.
En faisant : int tableau[4] = {0, 15, 65}, tu définis un tableau de 4 int comprenant 0,15, 65 et 0.
Après, tu l'as peut-être fait exprès, mais je préférais préciser ;-).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lagarkane
 
WOW, merci pour toutes ces réponses si rapides =p

Bon, alors j'ai eu une illumination, et j'ai trouvé pourquoi il m'affichait ce message...
En fait, j'ai déclaré le pointeur moyenne comme étant un double, alors qu'il s'agit de l'adresse d'une variable "double"... par conséquent, il s'agissait d'un "int" ....

Bref, maintenant, avec mon code, il me fait un super plantage, donc ca m'a pas beaucoup avancé, mais bon =p


Sinon bibliomax, je suis autodidacte, j'ai commencé ya 3jours, et ca fait 3jours que je fais que ca de 8h du mat à minuit/1h u_u (l'exploite mes vacances à fond pour faire ce que j'ai toujours voulu faire :D)
J'ai d'ailleurs passé une sale nuit, pk j'avais trop de codes en tete mdr.
Mais j'ai du mal a repérer les différences entre votre code et le mien..
Vous avez mis une variable X qui vaut 4, je suppose que c'est le nombre de lignes du tableau, mais j'avais tailleTableau pour ca.. donc cette variable n'est peut-être pas utile, non? à part ca, je remarque une autre différence avec mon code:
Il n'y a pas d'etoile devant les pointeurs, lorsque vous appelez les fonctions moyenneTableau et sommeTableau. Donc vous transmettez l'adresse de la variable, ce qui n'empeche pas de modifier son contenu, tout comme il est possible de le faire si je transmet "*pointeur"..

S'il y a une autre différence que je n'ai pas décelé, dites le moi silvouplait :D parceque je suis de nouveau bloqué :/

sinon, pour répondre a fiddy, je pense que les pointeurs sont indispensables pour mon programme, puisque j'essaye d'éviter les variables globales, (tout comme m@teo le conseille si bien dans son tuto) :P, et que je suis obligé de passer d'une fonction à l'autre avec mes variables.

Et pour répondre a ITACHI, je trouve personellement que les pointeurs ne sont pas si compliqués à comprendre. j'ai passé 3bonnes et longues heures sur le chapitre des pointeurs, mais le principe n'est pas si compliqué à cerner, et le tuto du site du zero l'explique TRES bien =)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
sinon, pour répondre a fiddy, je pense que les pointeurs sont indispensables pour mon programme, puisque j'essaye d'éviter les variables globales, (tout comme m@teo le conseille si bien dans son tuto) :P, et que je suis obligé de passer d'une fonction à l'autre avec mes variables.
Je ne t'ai pas dit d'utiliser de variables globales car effectivement il vaut mieux éviter. Mais dans ton cas, tu envoies une valeur en arguments qui ne va pas être modifier. Donc tu n'as pas besoin de pointeurs.
Lorsque tu envoies un argument en C, tu peux le passer par copie ou par adresse (pointeur). Tu passes l'adresse dans le cas où tu souhaites modifier la variable ou optimiser l'espace mémoire dans certain cas.
Dans les autres cas, un passage par copie suffira.
Je te conseille de bien relire le cours car c'est la base ;-))).
0
lagarkane
 
Bon, j'ai remplacé les "*pointeurs" par "pointeurs" dans les appels de fonction comme Bibliomax me l'a conseillé et ca marche!

Svp, bibliomax, vous pouvez m'expliquer pourquoi en donnant directement la valeur de la variable stockée dans le pointeur (à savoir "*pointeur"), ca ne marche pas, alors qu'en donnant simplement le pointeur ca marche?

J'ai l'impression d'avoir raté qqch là :p
Je vais relire le tuto sur les pointeurs encore une fois, j'ai peut-être as tout assimilé aussi bien que je le pensais :S
0