Afficher valeur d'une fonction

Résolu
karkol Messages postés 488 Statut Membre -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      il y a une erreur dans mon code, c'est bien
      } while ((x < 0) || (x > 360));
      qu'il faut lire.


      Dal
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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