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 mystère - Que fait ce code ?


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 184
    Points : 46
    Points
    46
    Par défaut Fonction mystère - Que fait ce code ?
    Bonsoir,

    Est-ce que quelqu'un aurait une idée de ce que fait ce code ?
    J'aimerais bien comprendre ligne par ligne svp ?
    Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef int(*z) (int);
     
    int mystery(z t[], int n)
    {
        z* s = t;
     
        while (*t && (*t)(n))
            t++;
     
        return *t ? (t - s) : -1;
    }

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    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
    typedef int(*z) (int); // z est un type "pointeur sur fonction retournant int 
                           // et ayant un paramètre de type int"
     
    int mystery(z t[], int n) // argument t : pointeur sur un z 
                              // Vu la suite, contiendra l'adresse du premier élément  
                              // d'un tableau de pointeurs sur fonctions (z)
    {
        z* s = t;             // s : pointeur sur un z initialisé avec t (début du tableau)
     
        while (*t && (*t)(n)) // tant que l'élément pointé par t est différent de NULL 
                              // et que la fonction pointée par t, appelée avec l'argument n 
                              // renvoie une valeur différente de 0
            t++;              // incrémenter t 
     
        return *t ? (t - s) : -1; // Si on est sorti du while avec l'élément pointé par t à NULL, renvoyer -1 
                                  // sinon renvoyer l'indice de la première fonction du tableau qui renvoie 0
    }
    Version équivalente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int mystery(z *t, int n)
    {
        z* s = t;
        while (*t!= NULL && (*t)(n)!=0)t++; 
        return *t!= NULL ? (t - s) : -1;
    }
    Exemple d'utilisation :
    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
    //-------------------------------
    #include <stdio.h>
    // Fonctions dont l'adresse est de type z
    int f1(int a) {return a-1;}
    int f2(int a) {return a-2;}
    int f3(int a) {return a-3;}
    //-------------------------------
    typedef int(*z) (int);
    int mystery(z t[], int n)
    {
        z* s = t;
     
        while (*t && (*t)(n))
            t++;
     
        return *t ? (t - s) : -1;
    }
    //-------------------------------
    int main(void)
    {
      int i ;
      z tab[] = {f1,f2,f3,NULL}; //Tableau de pointeurs sur les fonctions terminé par NULL
      for(i=0; i<5 ;i++)
         printf("%d\n", mystery(tab,i)); // affichage du résultat de la fonction mystery
      return 0;
    }
    Affichera
    -1
    0
    1
    2
    -1

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 184
    Points : 46
    Points
    46
    Par défaut
    Ok je te remercie pour l'explication, c'est parfait .

Discussions similaires

  1. Que fait ce code ?
    Par vieuxmonsieur dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/09/2012, 13h17
  2. Que fait ce code ?
    Par teol91 dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 24/10/2011, 10h38
  3. que fait ce code
    Par improcess dans le forum Images
    Réponses: 4
    Dernier message: 02/10/2011, 14h39
  4. que fait ce code !
    Par guitariste dans le forum C++
    Réponses: 11
    Dernier message: 01/05/2008, 15h29
  5. que fait ce code (et surtout pourquoi??)
    Par elekis dans le forum C++
    Réponses: 3
    Dernier message: 13/09/2005, 10h47

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