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++Builder Discussion :

va_list et TVarRec


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut va_list et TVarRec
    Bonjour a tous,

    j'ai une méthode qui contient une liste variable d'arguments. Mon problème est que dans certains cas, cette liste d'argument doit me servir dans AnsiString::Format.

    Evidemment, AnsiString::Format n'utilise pas un va_list mais un TVarRec et je n'arrive rien a faire.

    Mon but est de pouvoir utiliser AnsiString::Format en lui fournissant la liste de paramètres recus par ma methode.

    Si vous avez une solution en vue, n'hésitez pas a m'en faire part car je seche grave. Merci beaucoup.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    J'ai peut être trouvé une piste. Mais mon problème est désormais autre. Tout d'abord, j'ai trouvé cela:
    src= http://www.codeproject.com/KB/tips/va_pass.aspx
    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
     
    template<byte count>
    struct SVaPassNext{
        SVaPassNext<count-1> big;
        DWORD dw;
    };
    template<> struct SVaPassNext<0>{};
    //SVaPassNext - is generator of structure of any size at compile time.
     
     
    class CVaPassNext{
    public:
        SVaPassNext<50> svapassnext;
        CVaPassNext(va_list & args){
    		try{//to avoid access violation
     
    			memcpy(&svapassnext, args, sizeof(svapassnext));
    		} catch (...) {}
        }
    };
    #define va_pass(valist) CVaPassNext(valist).svapassnext
     
    #if 0 //using:
     
    void MyVA_Function(szFormat, ...){
        va_list args;
        va_start(args, szFormat);
        SomeOtherVA_Function(szFormat, va_pass(args));
        va_end(args);
    }
    #endif
    j'ai donc modifié ma fonction comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void test(AnsiString t, ...)
    {
       int total = 0;
       va_list ap;
       va_start( ap, t );
     
       TVarRec v[] = ARRAYOFCONST(va_pass(ap));
       AnsiString res = Format(t, v, ARRAYSIZE(v) - 1);  
       printf("%s\n", res.c_str());
     
       va_end(ap);
    }
    Mais désormais, j'ai une erreur: [C++ Error] Unit1.cpp(57): E2108 Utilisation impropre de typedef 'OpenArray<TVarRec>'

    c'est au niveau de la ligne "TVarRec v[] = ARRAYOFCONST(va_pass(ap))"

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Tout ceci me semble bien compliqué (je dois avouer que je ne comprends pas complètement l'exemple de l'article que tu cites).

    Néanmoins, si on regarde la définition de TVarRec (qui est fausse dans la version de l'aide que j'ai), c'est juste un "union" qui permet d'aller lire les différents type de données:
    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
      class TVarRec
      {
      public:
        union
        {
          Integer      VInteger;
    #if defined(TVARREC64)
          Largeint     VInt64;
    #endif
          Boolean      VBoolean;
          Char         VChar;
          PExtended    VExtended;
          PShortString VString;
          Pointer      VPointer;
          PChar        VPChar;
          TObject*     VObject;
          TClass       VClass;
          WideChar     VWideChar;
          PWideChar    VPWideChar;
          Pointer      VAnsiString;
          PCurrency    VCurrency;
          PVariant     VVariant;
        };
        union
        {
          Byte VType;
          /*
          long ForceAlignment;
      #if 0
        //! The ForceAlignment should be removed, if alignment set to 4
        //! we don't need this
      #endif
          */
        };
    Donc, il doit être possible de caster la va_list en un TVarRec. J'ai essayé ceci:

    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
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     
      Test(3,"123","456","789");
     
    }
    //---------------------------------------------------------------------------
    void TForm1::Test(int size,...) {
     
      va_list ap;
      va_start(ap, size);
      System::TVarRec *args=(System::TVarRec*)(ap);
     
      AnsiString result=Format("%s %s %s",args,size-1);
      ShowMessage(result);
     
    }
    Ca ne marche pas mais c'est peut-être une piste à explorer

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    merci pour ta réponse... Finalement, j'abandonne la chose pour le moment, mais si jamais une illumination venait, je vous en ferait bien evidemment part. Merci quand meme grandement a toi.

Discussions similaires

  1. utilisation de va_list
    Par Joccy dans le forum C
    Réponses: 7
    Dernier message: 08/04/2008, 11h29
  2. Réponses: 8
    Dernier message: 29/03/2007, 11h16
  3. Utilisation de va_list
    Par Stochastic dans le forum C
    Réponses: 4
    Dernier message: 11/04/2006, 10h01
  4. nombre d'arguments dans un ... avec va_list
    Par delfare dans le forum C
    Réponses: 5
    Dernier message: 24/01/2006, 09h20
  5. création d'une va_list
    Par veneto dans le forum C
    Réponses: 15
    Dernier message: 04/07/2005, 17h02

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