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 :

appel fonction variadique depuis une liste


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut appel fonction variadique depuis une liste
    Bonjour,

    Je désire appeler une fonction variadique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonctionVariadique (char *format, ...);
    La fonction qui devrait l'appeler serait de ce genre (pseudo code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void fonctionDepart (int a)
    {
      int element_liste;
     
      while (uneListe != NULL)
      {
        element_liste = premier_element_de (uneListe);
        ...
        uneListe = second_element_de (uneListe);
      }
      fonctionVariadique (format, les n element_liste);
    }
    où n est indéfini à la conception (mais pas à l'exécution évidemment). n pourra donc valoir 1, 2, 3, 10, etc.
    Et sachant que uneListe n'est pas un type connu de C (il s'agit d'une variable d'une machine virtuelle spécifique codée en C).
    En revanche, element_liste sera d'un type connu (la fonction premier_element_de effectuant la "conversion" entre la VM et C).

    Comment coder mon appel à fonctionVariadique ? Vu que n est variable.

    Si vous avez des pistes, n'hésitez pas. Merci.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut
    Au départ, j'avais pensé à :

    - parcourir la liste uneListe pour obtenir le nombre d'éléments qu'elle contient.
    - créer un tableau de taille ce nombre d'élément
    - reparcourir la liste et ajouter chaque element_liste dans mon tableau.
    - et appeler fonctionVariadique mais qu'est ce que je peux en faire de mon tableau pour créer l'appel ?

    Il y a peut-être plus simple à moins que je me focalise sur une mauvaise approche ...

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Si tu ne connais pas le nombre de paramètres à la compilation, tu ne peux utiliser la fonction variadique comme cela à moins d'avoir un code particulier comme celui là qui n'est pas efficace et qui est une horreur à maintenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(nb_param == 0)
       fonctionVariadique (format);
    else if(nb_param == 1)
       fonctionVariadique (format, element_0);
    else if(nb_param == 2)
       fonctionVariadique (format, element_0, element_1);
    else if(nb_param == 3)
       fonctionVariadique (format, element_0, element_1, element_2);
    etc...
    mais tu risques de tomber sur le cas non prévu (tu as prévu jusqu'à 20 et pas de chance, ta liste fait 23 elements)

    Je partirai plutôt sur un truc comme cela (en pseudo code) :
    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
    void fonctionDepart (int a)
    {
    <type> element_liste;
     
    unsigned long taille = taille(uneListe);
     
    <type> * table_element = malloc(sizeof(<type>) * taille);
       if(table_element == NULL)
       {
          // traitement d'erreur malloc
       }
     
      for(unsigned long index = 0; index != taille(uneListe); index++)
      {
        table_element[index] = element_de(uneListe, index);
      }
     
      fonctionVariadique (format, taille, table_element);
    }
    et c'est a la fonction variadique de gérer le nombre variable de paramètres

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Points : 53
    Points
    53
    Par défaut
    Une fonction variadique accepte un nombre variable de paramètres, c'est vrai. Mais lors de l'appel tous les paramètres doivent être connus à la compilation du programme. La seule souplesse est que l'on peut appeller une fois avec 2 paramètres et une autre fois avec 8. Toujours est il qu'à chaque fois, ces paramètres doivent être spécifiés à la compilation.

    Selon moi, oublie la fonction variadique. Fait une fonction "normale" (nombre de paramètres fixe) qui prend en paramètre une collection (tableau, liste ou autre) et éventuellement le nombre d'éléments à traiter...

    et t'auras juste à appeler ta fonction après.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    f(taille, maListe)
     
    ou 
     
    f(taille, monTableau)

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    les if ... else ... sont évidemment à proscrire !
    Sinon, merci pour vos suggestions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fonctionVariadique (format, taille, table_element);
    suggéré par ram-0000 me paraît une bonne approche. Un peu plus long à coder du coup mais plus propre. Surtout que ce ne sera plus une fonction variadique.

    Je met en résolu. Merci beaucoup, vos suggestions m'ont été précieuses.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/05/2008, 10h45
  2. comment appeler un widget depuis une fonction
    Par Thierry {-|-o dans le forum Tkinter
    Réponses: 3
    Dernier message: 02/01/2008, 23h23
  3. Appel d'une fonction A depuis une fonction B.
    Par LeFlou dans le forum C++
    Réponses: 9
    Dernier message: 22/05/2007, 17h36
  4. [WebForms]Comment appeler une fonction ASP depuis une JavaScript ?
    Par flagadda dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 11/08/2006, 14h24
  5. [VBA-E] Appel de fonction/procédure depuis une variable
    Par truman dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/05/2006, 16h20

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