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 :

[GTK]Appel fonction a nombre d arguments variable


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 6
    Points
    6
    Par défaut [GTK]Appel fonction a nombre d arguments variable
    Voila, je programme un peu avec GTK, et pour ceux qui connaissent, il y a des fonctions disponibles qui utilisent un nombre d arguments variables (comme printf).
    Seulement, j ai un probleme : j ai un tableau contenant un nombre variables de pointeurs de GtkWidget. Or, je dois justement appeler une telle fonction qui prend pour argument la liste de ces widgets. Je voudrais juste pouvoir si c est possible d avoir un algo, flexible (genre pas 36000 if/else if a la suite pour prendre ts les cas de 1 a n arguments), permetant de realiser ca.
    Peut etre que ca existe pas Je sais pas du tout en fait.

    Merci, j espere que c est a peu pres comprehensible.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut Re: Appel fonction a nombre d arguments variable
    Citation Envoyé par paulo-131
    une telle fonction qui prend pour argument la liste de ces widgets.
    Qu'entends-tu par "liste" ? De quel type est-elle ?
    Est-ce un tableau ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fonctionAAppeler(GtkWidget* liste[]);
    Si oui, alors le nombre d'arguments de la fonction à appeler n'est pas variable, il n'y en a qu'un : un tableau (cf. http://emmanuel-delahaye.developpez.com/notes.htm#param_tab).
    Ou est-ce que cette fonction doit accepter 1 à N GtkWidget* sous la forme suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fonctionAAppeler(GtkWidget *w1,GtkWidget *w2,GtkWidget *w3, ...);
    Dans ce cas, voir la FAQ C.

    Si j'ai mal compris la question, ce n'est peut-être pas entièrement de ma faute. Merci de mettre au moins un bout de code la prochaine fois (ex. : le prototype de la fonction à appeler), c'est parfois plus parlant.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Dsl, c est vrai que ce n est pas tres parlant.
    En fait je me base un tuto trouvé sur un autre site.

    Dans la partie GtkListStore, il y a la fonction de creation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkListStore* gtk_list_store_new(gint n_columns, ...);
    Voila mon probleme pour cette fonction, apres le gint, je met mon type de donnée pour chaque colonne (G_TYPE_STRING, G_TYPE_BOOLEAN, ...).
    Ce que je voudrais faire, c est que l utilisateur du programme donne le nombre n de colonnes et pour chaque colonne, le type de donnée (je stocke dans dans un tableau de dimension n).

    Par contre, apres avoir recolté ces infos, je sais pas comment faire l appel de la fonction

    Je vais avoir le meme type de probleme pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void gtk_list_store_set(GtkListStore *list_store, GtkTreeIter *iter, ...);

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Réponse générique (langage C en général)
    Réponse courte
    C'est impossible.

    Réponse longue
    C'est possible mais pas portable et nécessite l'utilisation de l'assembleur.
    Pour plus d'informations concernant le moyen d'appeler une fonction acceptant un nombre variable d'arguments ("variadic function" in English) en définissant le nombre (et le type) de ces arguments à l'exécution, vous pouvez lire "wacky ideas" (on the "inverse varargs problem").
    Bon courage.

    Réponse alternative (contournement)
    Une méthode alternative consisterait à définir les nombres minimum et maximum d'arguments à transmettre et de créer une fonction (qui servirait d'interface à la fonction à appeler) contenant un switch(nombreArguments) et autant de "case" que (max-min+1), chacun contenant un appel à la fonction voulue avec le bon nombre d'arguments. Cela pourrait ressembler à :
    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
    // Note : il vous faudra peut-être changer les valeurs des "case", je ne sais pas comment les "gint" sont implémentés.
    //        Ici, je les ai traités comme des "int".
    GtkListStore* my_var_gtk_list_store_new(gint n_columns, GType listeTypes[]) {
            // De 1 à 3 colonnes seulement...je vous laisse compléter pour les autres...
            switch(n_columns) {
                    case 1:
                            return gtk_list_store_new(n_columns,listTypes[0]);
                    case 2:
                            return gtk_list_store_new(n_columns,listTypes[0],listTypes[1]);
                    case 3:
                            return gtk_list_store_new(n_columns,listTypes[0],listTypes[1],listTypes[2]);
                    default:
                            return NULL;
            }
    }
    Réponse spécifique à Gtk
    Il semblerait que les dévelopeurs de Gtk aient déjà pensé au problème et aient créé la fonction qui vous manque.
    Ainsi, au lieu d'utiliser GtkListStore* gtk_list_store_new(gint n_columns, ...);, vous devriez pouvoir utiliser GtkListStore* gtk_list_store_newv(gint n_columns,GType *types);. Cela devrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      GType *types;
      gint      n_cols;
     
      n_cols = 3;
      types = g_new0 (GType, n_cols);
     
      types[0] = G_TYPE_UINT;
      types[1] = G_TYPE_STRING;
      types[2] = G_TYPE_WHATEVER;
     
      gtk_list_store_newv (n_cols, types);
     
      g_free (types);
    La différence, dans votre cas est qu'au lieu de stocker les types un à un, vous utiliserez une boucle...

    Voilà...
    Si votre problème a trouvé une solution, n'hésitez pas à cliquer sur (et à penser à moi à Noël )
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup. Je n avais pas pense a aller voir les autres fonctions documentées
    Par ontre, je pense pas avoirle niveau pour l assembleur

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

Discussions similaires

  1. Fonction avec nombre d'arguments variables
    Par cjacquel dans le forum Débuter
    Réponses: 5
    Dernier message: 03/02/2015, 15h29
  2. Réponses: 3
    Dernier message: 04/02/2011, 15h00
  3. Entourer (wrap) des fonctions à nombre d'arguments variable
    Par phildepantin dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/06/2010, 08h30
  4. [Fortran 95] Fonction au nombre d'arguments variable
    Par Ymkjen dans le forum Fortran
    Réponses: 1
    Dernier message: 12/02/2009, 15h15
  5. Réponses: 3
    Dernier message: 23/08/2007, 00h39

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