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++/CLI Discussion :

[List<List<double> >] passage en paramètre


Sujet :

C++/CLI

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut [List<List<double> >] passage en paramètre
    Bonjour à tous,

    j'ai une dll en C#, dont une méthodeprend en argument une List<List<double> >. Je crée des bindings en C++ pour cette dll et je rencontre un problème lors du passage de ce paramètre. Les autres méthodes marchent par ailleurs très bien.

    Le prototype de la fonction en C# est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     bool maMethode(
    ...,
    ref List<List<Double>> Intensity, 
    ref string ErrorMessage);
    En C++/CLI, je lui passe comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	List<List<double>^ > ^intensity = gcnew List<List<double>^ >();
    monObjet.maMethode(...,	intensity, errormessage);
    Et là le compilo m'insulte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error	1	error C2664: 'MSU::MSUController::maFonction' : cannot convert parameter 1 from 'System::Collections::Generic::List<T> ^' to 'System::Collections::Generic::List<T> ^'
    C'est-à-dire, en gros : désolé mon gars, je peux pas convertir ton type A en type A. Dommage, hein?

    Ca me rend dingue!

    Donc, à votre avis c'est moi qui fait une bêtise ou pas? Quelqu'un voit une solution?
    Merci d'avance!

    NB: je précise que je suis sous Visual 2008 et ma dll utilise le framework 2.0

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Oups!
    Je viens de voir ma bêtise!!


  3. #3
    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 518
    Points
    41 518
    Par défaut
    Sur le coup, je n'ai pas vu la bêtise en question.
    Mais j'ai vu l'autre bêtise, celle qui consiste à poster l'erreur de la fenêtre Errors, au lieu de l'erreur du log de compilation qui est plus complète.
    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.

  4. #4
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Salut,

    J'ai exactement le même problème.

    Par contre je vois pas c'est quoi l'astuce au juste.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    À vue de pif, la déclaration de la fonction prend en paramètre un pointeur d'une liste de liste (<- burp, ) et lui il crée un pointeur d'une liste de pointeurs de liste.

    Cherche le petit chapeau ^ en +

  6. #6
    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 518
    Points
    41 518
    Par défaut
    @LinuxUser, tu as "le même problème", mais tu fais exactement le même seconde erreur que popoms: Tu as, toi aussi, négligé de poster l'erreur complète provenant du log de compilation (fenêtre Output -> Build).
    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.

  7. #7
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    En fait j'ai d'un côté un programme appelant en C#, et de l'autre une DLL C++/CLI (un wrapper de code C++).

    Donc, le C++/CLI ressemble à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //Wrapper.h
    public ref class Wrapper
    {
      public:
        generic <typename T>
        void entryPointWrapper(List<List<List<T>^>^>^ list3D);
      private:
        generic <typename T>
        void list3DResize(unsigned int size, List<List<List<T>^>^>^ list3D, T value);
    }
    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
    // Wrapper.cpp
    /*----------------------------------------------------------------------------*/
    generic <typename T>
    void Wrapper::entryPointWrapper(List<List<List<T>^>^>^ list3D)
    {
    	unsigned int size = 16;
     
    	list3DResize<double>(size, list, 0.2503); // ---> erreur compilation
    }
    /*----------------------------------------------------------------------------*/
    generic <typename T>
        void  Wrapper::list3DResize(unsigned int size, List<List<List<T>^>^>^ list3D, T value)
    {
      // pas encore implémentée
    }
    /*----------------------------------------------------------------------------*/
    Le programme C#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Wrapper w = new Wrapper();
    List<List<List<double>>> list3D = new List<List<List<double>>> { };
     
    w.entryPointWrapper(list3D );
    Le message d'erreur complet:
    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
    Wrapper.cpp(27): error C2664: 'void Wrapper::list3DResize<double>(unsigned int,System::Collections::Generic::List<T> ^,double)' : cannot convert parameter 2 from 'System::Collections::Generic::List<T> ^' to 'System::Collections::Generic::List<T> ^'
     with
    2>          [
    2>              T=System::Collections::Generic::List<System::Collections::Generic::List<double> ^> ^
    2>          ]
    2>          and
    2>          [
    2>              T=System::Collections::Generic::List<System::Collections::Generic::List<T> ^> ^
    2>          ]
    2>          and
    2>          [
    2>              T=System::Collections::Generic::List<System::Collections::Generic::List<double> ^> ^
    2>          ]
    2>          No user-defined-conversion operator available, or
    2>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    2>Wrapper.cpp(119): error C2664: 'void Wrapper::listResize<double>(unsigned int,System::Collections::Generic::List<T> ^,double)' : cannot convert parameter 2 from 'System::Collections::Generic::List<T> ^' to 'System::Collections::Generic::List<T> ^'

  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 518
    Points
    41 518
    Par défaut
    L'erreur ici me parraît assez évidente:
    Code C++/CLI erroné : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    generic <typename T>
    void Wrapper::entryPointWrapper(List<List<List<T>^>^>^ list3D)
    {
    	unsigned int size = 16;
     
    	list3DResize<double>(size, list, 0.2503); // ---> erreur compilation
    }
    Tu tentes de convertir, sans le moindre cast, une List<List<List<T>^>^>^ en List<List<List<double>^>^>^.
    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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Pardon, c'était juste un test que j'avais oublié d'enlever, ce que je voulais c'est ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    generic <typename T>
    void Wrapper::entryPointWrapper(List<List<List<T>^>^>^ list3D)
    {
    	unsigned int size = 16;
     
    	list3DResize(size, list, 0.2503); // ---> erreur compilation
    }
    Et qu'on puisse appeler la function avec une liste de "double", "bool" ou ce que l'on veut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<List<List<double>>> list3D = new List<List<List<double>>> { };
    // ou List<List<List<bool>>> list3D = new List<List<List<double>>> { };
    // ou List<List<List<enumA>>> list3D = new List<List<List<double>>> { };
     
    w.entryPointWrapper(list3D );

  10. #10
    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 518
    Points
    41 518
    Par défaut
    En fait, où est la déclaration de list? Ou bien est-ce encore une typo?

    Auquel cas, poste ton vrai code.
    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.

  11. #11
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Je résume:

    Niveau appelant et instanciation de la list 3D en C#:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
      Wrapper w = new Wrapper();
      // liste passée en wrapper C++/CLI
      List<List<List<double>>> list3D = new List<List<List<double>>> { };
     
      w.entryPointWrapper(list3D );
    }
    Code C++/CLI:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    generic <typename T>
    void Wrapper::entryPointWrapper(List<List<List<T>^>^>^ list3D)
    {
    	unsigned int size = 16;
     
    	list3DResize(size, list3D, 0.2503); // ---> erreur compilation
    }
    La fonction n'est pas encore implémentée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    generic <typename T>
        void  Wrapper::list3DResize(unsigned int size, List<List<List<T>^>^>^ list3D, T value)
    {
      // pas encore implémentée
    }
    /

  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 518
    Points
    41 518
    Par défaut
    Là, ça ressemble plus à un problème lié au fait que tu passes un double en troisième paramètre de la méthode...
    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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    L'erreur est bien indiquée sur la list (2ème argument):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cannot convert parameter 2 from 'System::Collections::Generic::List<T> ^' to 'System::Collections::Generic::List<T> ^'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list3DResize(size, list3D, 0.2503); // ---> erreur compilation

  14. #14
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    En fait, Médinoc tu avais raison, il s'agit bien du 3ème argument de type double contrairement à ce que m'indique le compilateur.

    Ainsi, la correction est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // C++/CLI
    generic <typename T>
    void list3DResize(unsigned int size, List<List<List<T>^>^>^ list, T value);
    Et on l'appelle ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // C#
    list3DResize(size, list, value); // avec val de même type que ce que contient le container "list"
    Merci beaucoup de votre aide, surtout à toi Medinoc.

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

Discussions similaires

  1. creation d'une LIST avec un maillon double
    Par jaussiba dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 30/10/2008, 11h48
  2. [DOM] listes déroulantes dynamiques et passage de paramètres
    Par sorcade dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 09/09/2008, 12h07
  3. Regrouper une liste en liste de listes
    Par West01 dans le forum Prolog
    Réponses: 12
    Dernier message: 14/03/2008, 15h07
  4. liste ou vecteur de double indicé par des dates
    Par LePetitBricoleur dans le forum SL & STL
    Réponses: 3
    Dernier message: 15/10/2007, 11h21
  5. Trier une liste en comparant des doubles
    Par babylone7 dans le forum Langage
    Réponses: 10
    Dernier message: 03/05/2007, 11h38

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