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 :

Taille d'une va_list


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut Taille d'une va_list
    Bonjour à tous,

    Je suppose que la question a déjà été posée des dizaines de fois, malheureusement, je n'ai pas trouvé de réponse avec la recherche...

    La question est la suivante : est-il possible de connaître le nombre d'éléments que contient une va_list ?

    Présentement, j'utilise un marqueur de fin :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    /**
     * Fonction permettant de creer un tableau dynamique
     * @param iDataType le type des donnees qui suivent
     * @param ... les données, pouvant etre des chaines, des booleens, des 
     * entiers, ou des GType. Il faut obligatoirement terminer par un
     * G_TYPE_INVALID
     * @return pointeur vers notre structure
     */
    CidDataTable *
    cid_create_datatable (GType iDataType, ...)
    {
        CidDataTable *res = cid_datatable_new();
        GType iCurrType = iDataType;
        va_list args;
        va_start(args,iDataType);
        void *current;
        while ((current = va_arg(args,void *)) != G_TYPE_INVALID) {
            CidDataContent *tmp = NULL;
            if ((GType) current == G_TYPE_BOOLEAN || (GType) current == G_TYPE_INT || (GType) current == G_TYPE_STRING)
            {
                iCurrType = (GType) current;
                continue;
            }
            switch (iCurrType) 
            {
                case G_TYPE_BOOLEAN:
                    tmp = cid_datacontent_new_boolean(current);
                    break;
                case G_TYPE_STRING:
                    tmp = cid_datacontent_new_string(current);
                    break;
                case G_TYPE_INT:
                    tmp = cid_datacontent_new_int(current);
                    break;
                default:
                    iCurrType = (GType) current;
            }
            res = cid_datatable_append(res,tmp);
        }
        va_end(args);
        return res;
    }
    Mais existe-t-il un moyen de savoir combien de paramètres optionnels ont été entrés ?

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut



    Tu parcours la va_list et à chaque itération de la boucle tu incrémentes un compteur de 1.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par BSans Voir le message
    La question est la suivante : est-il possible de connaître le nombre d'éléments que contient une va_list ?
    Non, seul l'appelant connait le nombre de paramètres qu'il a mis sur la pile.
    Il y aurait peut être une possibilité mais il faut faire de l'assembleur pour regarder et comparer les pointeurs de pile, de frame et autres pointeurs. Personnellement, je ne m'y risquerait pas.

    Citation Envoyé par BSans Voir le message
    Présentement, j'utilise un marqueur de fin :
    continue

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Merci pour ces réponses rapides !

    En conclusion, il n'y a aucun autre moyen de "protéger" la fonction que le marqueur de fin ?

    Une autre technique serait d'utiliser un paramètre int nb_elem, mais ça revient au même niveau "sécurité" ; il faut faire confiance au développeur qui utilisera la fonction.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par BSans Voir le message
    En conclusion, il n'y a aucun autre moyen de "protéger" la fonction que le marqueur de fin ?

    Une autre technique serait d'utiliser un paramètre int nb_elem, mais ça revient au même niveau "sécurité" ; il faut faire confiance au développeur qui utilisera la fonction.
    Tout à fait Le mieux reste encore de finir la liste avec une valeur comme NULL par exemple !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Tout à fait Le mieux reste encore de finir la liste avec une valeur comme NULL par exemple !
    Oui. J'utilise en fait la valeur G_TYPE_INVALID pour signaler la fin de ma liste.

    Et donc, une dérivée de la question initiale.

    Peut-on "concaténer" un argument manuellement ?

    Dans l'idée, on obtiendrait quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void ma_vraie_fonction (char *blah, va_list list);
     
    void ma_fonction (char *blah, ...)
    {
        va_list args;
        va_start (args, blah);
        /* ici on concatène args avec G_TYPE_INVALID */
        ma_vraie_fonction (blah, args);
        va_end (args);
    }

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    J'ai déjà essayé par le passé pour un projet de faire des modifications dans une va_list mais cela n'est pas trop possible et si ca l'est, très risqué.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par BSans Voir le message
    En conclusion, il n'y a aucun autre moyen de "protéger" la fonction que le marqueur de fin ?
    Pas à ma connaissance

    Citation Envoyé par BSans Voir le message
    Une autre technique serait d'utiliser un paramètre int nb_elem, mais ça revient au même niveau "sécurité" ;
    Tout à fait

    Citation Envoyé par BSans Voir le message
    il faut faire confiance au développeur qui utilisera la fonction.
    Oui !!

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

Discussions similaires

  1. Comment calculer la taille d'une base de données ?
    Par say dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 01/04/2011, 16h48
  2. Réponses: 10
    Dernier message: 22/05/2004, 13h51
  3. [SQL SERVEUR]taille d'une base de donnée
    Par hirochirak dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 08/01/2004, 12h07
  4. : Adapter la taille d'une grille
    Par SteelBox dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/07/2003, 07h08
  5. Taille d'une console sous linux
    Par Shinjuku dans le forum C
    Réponses: 7
    Dernier message: 13/06/2003, 12h44

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