Erreur après compilation

float -  
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Ben voila je commence la programmation en c et je m'bloque sur cette exercice (plus bas). Après compilation je n'est en tout et pour tout qu'une seul erreur, seulement il en affiche 2 répétés plusieurs fois:
passing arg 1 of 'sscanf' makes pointer from integer whithout a cast
passing arg 1 of 'gets' makes pointer from integer whithout a cast


exercice

Écrire une fonction permettant de remplir 2 tableaux de dimension n et m. La fonction devra ensuite calculer les moyennes, les comparer et retourner la plus grande
On suppose que la fonction reçoit comme paramètre les dimensions des tableaux

Code:

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

//les dimensions sont les paramettre de la fonction

float dim(int n,int m)
{
float tab1[n],tab2[m],som1,som2,moy1,moy2;
int i,controle;
char ligne;

som1=0;
som2=0;

//saisie des valeurs des deux tableaux

printf("Tableau 1");
for(i=0;i<n;i++){ printf("Saisissez l'element %d:\t",i+1);
gets(ligne);
controle=sscanf(ligne,"%f",&tab1[i]);
while(!controle){ do{ printf("Saisissez un nombre:\t");
gets(ligne);
controle=sscanf(ligne,"%f",&tab1[i]);
}
while(controle<1);
}
som1=som1+tab1[i];
}
printf("\n");
moy1=som1/n;

printf("Tableau 2");
for(i=0;i<m;i++){ printf("Saisissez l'element %d:\t",i+1);
gets(ligne);
controle=sscanf(ligne,"%f",&tab2[i]);
while(!controle){ do{ printf("Saisissez un nombre:\t");
gets(ligne);
controle=sscanf(ligne,"%f",&tab2[i]);
}
while(controle<1);
}
som2=som2+tab2[i];
}

printf("\n");
moy1=som1/n;

if(tab1[i]<tab2[i]){return 1;}
else{return 0;}
}

int main()
{

int n,m,controle;
char ligne;

//Saisie des dimensions

printf("Saisissez la dimension du tableau1:\t");
gets(ligne);
controle=sscanf(ligne,"%d",n);
while(!controle){ do{ printf("Saisissez un entier:\t");
gets(ligne);
controle=sscanf(ligne,"%d",&n);
}
while(controle<1);
}

printf("Saisissez la dimension du tableau2:\t");
gets(ligne);
controle=sscanf(ligne,"%d",m);
while(!controle){ do{ printf("Saisissez un nombre:\t");
gets(ligne);
controle=sscanf(ligne,"%d",&m);
}
while(controle<1);
}
printf("\n");

//Appelle de la fonction

dim(n,m);

system("PAUSE");
return 0;
}

Ps: Je développe sous dev-c++ 4

Merci de vous être intéressé a mon probléme

2 réponses

fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Salut,
Il y a plusieurs problèmes.
Il ne faut jamais employer gets, mais lui préférer fgets. gets prend un argument un char* et non un char.
T'as oublié une esperluette devant la variable n dans le premier sscanf de main.
D'ailleurs tu peux utiliser do while et ne pas respecter cette portion.
Même remarque pour la variable m.

Et enfin dernière remarque, n'oublie pas de poster ton code en utilisant les balises "code" (à droite du bouton souligné).
Cdlt
0
float
 
Merci d'avoir bien voulu me répondre. Dzl pour le code je suis un peut tête en l'air :p
Concernant ta première remarque: J'ai remplacé les gets par fgets et la 8 erreurs s'affiche a la compilation mais bon je n'en voit que 4 : Les 2 d'avants et
too few arguments to function `fgets'
too few arguments to function `sscanf'

Concernant la deuxième
D'ailleurs tu peux utiliser do while et ne pas respecter cette portion. 
, je ne l'ai pas bien comprise
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Le prototype de fgets n'est pas le même que gets, c'est d'ailleur ça qui fait que c'est mieux.
Le prototype est fgets(char* chaine ,int size, FILE*fstream). Le premier argument, c'est pour la chaine de caractère, size la taille et le dernier tu mettras le flux stdin.
Un exemple :
char chaine[10];
fgets(chaine,sizeof(chaine),stdin);
//pour convertir en nombre
int nb=strtol(chaine,NULL,10); //tu peux utiliser comme tu as fait sscanf


Pour le do while, ce que je veux dire :
scanf("%d",&n);
while(n<0){
   scanf("%d",&n);
}

peut-être simplifié en :
do{
   scanf("%d",&n);
}while(n<0);

Cdlt
0