Afficher valeur d'une fonction

Résolu/Fermé
karkol Messages postés 408 Date d'inscription mardi 24 janvier 2012 Statut Membre Dernière intervention 17 décembre 2016 - 18 oct. 2013 à 11:20
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 18 oct. 2013 à 19:36
Bonjour,
Je dois afficher la valeur retourner par une fonction : ici angleAntenne dans le programme principal.
int captlang (); //prototype

//Programme principal
case 'A':
angleAntenne=captangl();
sscanf("%d",&angleAntenne);
printf("%d",&angleAntenne);
break;


int captangl () //La fonction
{
int x; //Pour la conversion de la chaine de carac en integer
char angl [5];
do{
printf("saisissez un nombre en 0 et 360\n");
fgets(angl,4,stdin); //attend la saisie
x=atof (angl); //ASCII to float
sscanf (angl,"%d",&x);
} while ((x<0 )|| (x>360));
return x;
}




Cela me met une erreur :
quad.c: In function `main':
quad.c:77:5: attention : format `%d' expects argument of type `int', but argument 2 has type `int (*)()' [-Wformat]

Je ne comprend pas pourquoi cela ne fonctionne pas.

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 18/10/2013 à 13:20
Salut,

je déduis de ton code que
angleAntenne
est déclaré comme
int angleAntenne;
.

Le prototype de sscanf est :

int sscanf ( const char * s, const char * format, ...);

(voir http://www.cplusplus.com/reference/cstdio/sscanf/)

donc
sscanf("%d",&angleAntenne);
est erroné.

Tu veux faire quoi exactement ?

En suite, c'est normal que
printf("%d",&angleAntenne);
donne le warning que tu mentionnes. Si tu veux afficher l'int contenu dans angleAntenne, tu dois faire simplement
printf("%d",angleAntenne);
.

Pour ta fonction, atof n'est pas géniale, en raison des faiblesses de cette fonction en C, et cela t'oblige à convertir encore de float en int, puisque je comprends que ce sont des entiers que tu attends, de plus sans contrôle d'erreur valable.

Si 0 ou 360 sont des entrées valables, elles devraient être acceptées (de plus une entrée de 0 ne permettrait pas de distinguer le résultat obtenu d'une erreur, avec atof).

strol est plus indiquée.

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

int captangl() //La fonction
{
long int x; //Pour la conversion de la chaine de carac en integer
char angl[5];
char * p;
do
{
printf("saisissez un nombre entier "
"entre 0 et 360 (compris)\n");
if (fgets(angl, 4, stdin) != NULL)
{
x = strtol(angl, &p, 10);
if (angl[0] != '\n' && (*p == '\n' || *p == '\0'))
printf("Vous avez entré le nombre : %ld\n", x);
else
{
printf("Erreur : vous n'avez pas "
"entré un nombre valide\n");
exit(EXIT_FAILURE);
}
}
} while ((x <= 0) || (x >= 360));
/* C'est bien un nombre qui a été saisi, et il est
* dans les limites acceptées. Il tient donc bien dans
* un int, que l'on peut retourner comme l'attend le
* prototype */
return (int) x;
}

int main(void)
{
int angleAntenne;

angleAntenne = captangl();
/* la ligne commentée ci-après ne sert à rien, à mon sens
* sscanf("%d", &angleAntenne);
* ou alors, je n'ai pas compris ce que tu veux
* (outre le fait que sa syntaxe est fausse) */
printf("%d", angleAntenne);

return 0;
}

Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
18 oct. 2013 à 15:03
il y a une erreur dans mon code, c'est bien
} while ((x < 0) || (x > 360));
qu'il faut lire.


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 18/10/2013 à 19:45
et pour prendre toutes les précautions, cela serait mieux aussi d'initialiser x avec une valeur par défaut en dehors des valeurs permises, par exemple :
long int x = -1;
, et de purger stdin.

Cela donnerait donc cela :

int captangl() //La fonction
{
long int x = -1; //Pour la conversion de la chaine de carac en integer
char angl[5];
char * p;
char c;
do
{
printf("saisissez un nombre entier "
"entre 0 et 360 (compris)\n");
if (fgets(angl, 4, stdin) != NULL)
{
x = strtol(angl, &p, 10);
if (angl[0] != '\n' && (*p == '\n' || *p == '\0'))
printf("Vous avez entré le nombre : %ld\n", x);
else
{
printf("Erreur : vous n'avez pas "
"entré un nombre valide\n");
exit(EXIT_FAILURE);
}
}
while ((c = getchar()) != '\n' && c != EOF)
/* vider ce qui reste dans stdin */;
} while ((x < 0) || (x > 360));
/* C'est bien un nombre qui a été saisi, et il est
* dans les limites acceptées. Il tient donc bien dans
* un int, que l'on peut retourner comme l'attend le
* prototype */
return (int) x;
}

Dal
0