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 :

FLOAT TO VARIANT


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut FLOAT TO VARIANT
    Bonjour à tous,

    J'aimerais pour une application OPC convertir un FLOAT en VARIANT, est ce possible?

    Merci beaucoup.

  2. #2
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Oui, c'est possible.

    ça depend de comment sont implementés tes VARIANTS.

    Les VARIANTS, c'est juste une technique, différentes bibliothèques l'implémentent de différentes façons.

    Il y a boost::variant dans Boost
    Il y a QVariant dans Qt
    Il y a ...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    Salut,

    OPC utilise les variables de type tagVARIANT
    pour utiliser un float, il faut définir le type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tagVARIANT maVariableFlottante;
     
    maVariableFlottante.vt = VT_R4;
    ensuite, tu affectes la valeur dans le champ correspondant aux flottants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariableFlottante.fltVal = 123.456;
    Tu trouveras la définition de la structure tagVARIANT dans le fichier oaidl.h (dans les répertoires de visual studio normalement...)

  4. #4
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Ok donc pour mon cas ca devrait donner ca ?
    Ja' besoin de votre avis car je ne peux pas faire de run pour le moment, mais au build tout semble correct.

    En fait non ca plante....

    Merci


    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
    // Python return a value which is a Python Object
                // To Send in OPC, we need a VARIANT
                tagVARIANT maVariableFlottante;
                maVariableFlottante.vt = VT_R4;
     
               // je fait la conversion pointervar de typen PyObject en "f"
                PyArg_Parse(pointervar, "f",&maVariableFlottante.vt);
     
     
                // Create the group
                // By default, the name of the group is Group_Opc
                COPCGroup* MyGroupOPC = GetGroup(opc, "Group_Opc");
     
                // write to OPC the value of Python
                MyGroupOPC->addItem(NodePath, true)->writeSync(maVariableFlottante);

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    tagVariant c'est du microsoft pure et dur. (je connaissais pas). Donc niveau portabilité y'a mieux. (boost::variant comme cité plus haut).

    D'ailleurs après recherche :
    This class supports the .NET Framework infrastructure and is not intended to be used directly from your code.
    http://msdn.microsoft.com/fr-fr/library/tagvariant.aspx
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    ça serait pas plutôt ça :
    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
    // Python return a value which is a Python Object
                // To Send in OPC, we need a VARIANT
                tagVARIANT maVariableFlottante;
                maVariableFlottante.vt = VT_R4;
    
               // je fait la conversion pointervar de typen PyObject en "f"
                PyArg_Parse(pointervar, "f",&maVariableFlottante.fltVal);
                
                
                // Create the group
                // By default, the name of the group is Group_Opc
                COPCGroup* MyGroupOPC = GetGroup(opc, "Group_Opc");
    
                // write to OPC the value of Python
                MyGroupOPC->addItem(NodePath, true)->writeSync(maVariableFlottante);
    à moins que tu ais fait une erreur de recopie...

  7. #7
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Oui effectivement ca serait plutôt ce que tu dis, et le plantage venait de toute façon d'ailleurs.
    Je vous retiens au courant sous peu,
    En attendant merci
    Julien

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je recommande d'utiliser directement le typedef VARIANT plutôt que la structure tagVARIANT sous-jacente...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Bon ça à l'air de fonctionner pour un float,
    J'ai aussi besoin d'effectuer le même traitement pour un Int et un String.
    Je ne connais pas du tout les conversions avec ce type d'éléments.
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                tagVARIANT monstring;
                monstring...=..;
     
               // je fait la conversion pointervar de typen PyObject en "f"
                PyArg_Parse(pointervar, "s",&maVariableFlottante.IVal);
     
     
                // Create the group
                // By default, the name of the group is Group_Opc
                COPCGroup* MyGroupOPC = GetGroup(opc, "Group_Opc");
     
                // write to OPC the value of Python
                MyGroupOPC->addItem(NodePath, true)->writeSync(maVariableFlottante);

  10. #10
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Comme dis par médinoc et moi même implicitement utilise VARIANT (c'est un typedef) plutôt que tagVariant qui n'est pas fait pour être utilisé dans un code final.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  11. #11
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Ok pour le typedef VARIANT plutôt que tagVARIANT
    Mais je suis tout de même obligé de faire la conversion
    Si je reprend mon code initial on a :

    Pour un string et un int connaissez vous les conversions?

    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
    // Python return a value which is a Python Object
                // To Send in OPC, we need a VARIANT
                VARIANT maVariableFlottante;
                maVariableFlottante.vt = VT_R4;
    
               // je fait la conversion pointervar de typen PyObject en "f"
                PyArg_Parse(pointervar, "f",&maVariableFlottante.fltVal);
                
                
                // Create the group
                // By default, the name of the group is Group_Opc
                COPCGroup* MyGroupOPC = GetGroup(opc, "Group_Opc");
    
                // write to OPC the value of Python
                MyGroupOPC->addItem(NodePath, true)->writeSync(maVariableFlottante);

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai posté ailleurs pour les strings (utiliser une BSTR).
    Pour les int, c'est VT_I4 :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int monEntier = ... ;
    VARIANT var;
    VariantInit(&var);
    V_VT(&var) = VT_I4;
    V_IA(&var) = monEntier;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    eheh,
    moi aussi ça m'intéresse

    pour les chaines de caractères, c'est

    quelles sont les fonctions du type V_IA, V_BSTR mais pour les int, les float, les bool, les short?...
    où trouve-t-on leur définition?
    j'ai cherché mais trouve pas

  14. #14
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    http://msdn.microsoft.com/en-us/library/ms221627.aspx


    En bas y'a le tableau des correspondances.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce ne sont pas des fonctions mais des macros, en fait.

    C'est simple, c'est le même nom que pour les constantes VT_*, sans le "T".
    • VT_I4 et V_I4 pour int (32 bits)
    • VT_R4 et V_R4 pour float (32 bits)
    • VT_R8 et V_R8 pour double (64 bits)
    • VT_BOOL et V_BOOL pour les booléens (attention, utiliser VARIANT_TRUE et VARIANT_FALSE, pas 1 et 0)
    • VT_I2 et V_I2 pour les short (16 bits)
    • type + VT_BYREF pour les pointeurs, avec par exemple V_I4REF pour un pointeur sur int.

    Apparemment, il n'y a pas d'aide sur les macros, mais leurs définitions sont dans <OleAuto.h>. Pour les constantes de types, tu peux les trouver dans l'aide, et leur définition est dansWTypes.h.

    Juste un truc à propos des char: Pour des raisons de compatibilité, la constante de type VT_I1 désigne en vérité le type OLECHAR, qui est un wchar_t. Il n'existe plus de type char ou signed char dans les variants. Par contre, la constante VT_UI1 désigne toujours un unsigned char (ou "byte").
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    yeah,
    merci Médinoc

  17. #17
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Merci à tous, c'est impeccable.

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

Discussions similaires

  1. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    Réponses: 9
    Dernier message: 05/05/2005, 12h37
  2. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15
  3. [7RC3] Formatage de champs float
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 19/05/2003, 09h38
  4. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 12h32
  5. Convertion de type VARIANT à type CString
    Par j_grue dans le forum MFC
    Réponses: 2
    Dernier message: 07/11/2002, 14h18

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