IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

fonction sans argument typé


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut fonction sans argument typé
    Bonjour

    J'ai vu qu'on pouvait avoir des fonctions dont l'argument était typé mais pas déclaré dans la fonction:
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void f(bool,int){
    	__formal;
    int o=3;
    }
     
    int main(){
    bool p=true;
    	f(p,2);
     
    }
    Mais j'ai vu dans les variables locales qu'il y a un argument qui est en fait caché, et qui s'appelle __formal.
    Pourriez vous svp me donner quelques explications sur ce genre de fonction?
    Notamment comment utiliser __formal?

    Je vous remercie

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Ça ressemble à une extension propre à ton compilateur (le double underscore indique généralement ceci). Je te conseillerai plutôt de ne pas l'utiliser, donc .

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Ce lien peu t'aider.

    http://publications.gbdirect.co.uk/c...ion_types.html

    Tu peux effectivement faire une déclaration de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double sq_root(double);
    Cela sert à définir un prototype et indiquer au compilateur que tu va te servir d'une fonction que tu va implémenter plus tard.

    Cependant hormis des algorithme récursif, il y'a toujours moyen de s'arranger pour que ta fonction soit définie avant son utilisation.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <stdio.h>
    #include <stdlib.h>
    #define DELTA 0.0001
    main(){
          double sq_root(double); /* prototype */
          int i;
     
          for(i = 1; i < 100; i++){
                  printf("root of %d is %f\n", i, sq_root(i));
          }
          exit(EXIT_SUCCESS);
    }
     
    double
    sq_root(double x){      /* definition */
          double curr_appx, last_appx, diff;
     
          last_appx = x;
          diff = DELTA+1;
     
          while(diff > DELTA){
                  curr_appx = 0.5*(last_appx
                          + x/last_appx);
                  diff = curr_appx - last_appx;
                  if(diff < 0)
                          diff = -diff;
                  last_appx = curr_appx;
          }
          return(curr_appx);
    }
    Peux tout aussi bien s'écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #include <stdio.h>
    #include <stdlib.h>
    #define DELTA 0.0001
     
     
    double sq_root(double x){      /* definition */
          double curr_appx, last_appx, diff;
     
          last_appx = x;
          diff = DELTA+1;
     
          while(diff > DELTA){
                  curr_appx = 0.5*(last_appx
                          + x/last_appx);
                  diff = curr_appx - last_appx;
                  if(diff < 0)
                          diff = -diff;
                  last_appx = curr_appx;
          }
          return(curr_appx);
    }
     
    main(){
          int i;
          for(i = 1; i < 100; i++){
                  printf("root of %d is %f\n", i, sq_root(i));
          }
          exit(EXIT_SUCCESS);
    }
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Mais j'ai vu dans les variables locales qu'il y a un argument qui est en fait caché, et qui s'appelle __formal.
    Pourriez vous svp me donner quelques explications sur ce genre de fonction?
    Notamment comment utiliser __formal?
    En C++, si tu ne donnes pas de nom aux paramètres de tes fonction, alors tu ne peux pas les utiliser dans le corps de celle-ci. Ces paramètres sont parfois nécessaires (par exemple pour les fonctions virtuelles qui doivent avoir la même signature) même si non utilisés.
    __formal est une extension de Visual C++ qui me semble non documentée (pour du debug ?). Tu dois l'avoir vu uniquement dans du code spécifique au compilateur. Je ne peux que vivement te déconseiller d'utiliser __formal. Ce n'est pas utilisable avec d'autres compilateurs. Et même avec Visual, ça n'est peut être pas pérenne d'une version sur l'autre.

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Il existe des cas où tu dois écrire une fonction en suivant un prototype bien défini, mais tu te rends compte que tu ne te sers pas des paramètres de cette fonction. Un exemple classique : une callback dont tu te moques des arguments, ou une fonction de gestion d'un thread.

    Un exemple certes un peu idiot, mais qui montre ce dernier cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    // prototype normal de la fonction: int threadfunc(void* data)
    // mais je sais que je ne passe pas de paramètre "data", donc je
    // me moque de la valeur. Si je rajoute le nom de la variable, mon
    // compilateur va se plaindre parce que la variable n'est pas 
    // utilisée dans le code. Donc autant ne pas le mettre...
    int my_thread(void*)
    {
      while (true)
      {
        int c = read_kdb();
        if (c == KBD_ESCAPE) break;
      }
    }
     
    int main()
    {
      thread t = create_thread(/*threadfunc=*/ my_thread, /*data=*/ NULL);
      wait_for_termination(t);
    }
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction sans arguments par défaut
    Par Doksuri dans le forum Langage
    Réponses: 1
    Dernier message: 15/09/2010, 17h44
  2. Fonction avec et sans arguments
    Par moussecp dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/04/2010, 22h28
  3. Déclarer fonction sans argument
    Par sp2308 dans le forum Débuter
    Réponses: 5
    Dernier message: 18/09/2008, 00h12
  4. fonction sans argument ne renvoyant rien
    Par perdro dans le forum C
    Réponses: 3
    Dernier message: 25/11/2006, 22h16
  5. Signature d'une fonction sans argument
    Par cj227854 dans le forum C++
    Réponses: 5
    Dernier message: 20/10/2005, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo