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 : 43
    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 : 43
    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 380
    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 380
    Points : 41 576
    Points
    41 576
    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.

  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 : 594
    Points
    594
    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 668
    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 668
    Points : 10 670
    Points
    10 670
    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 380
    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 380
    Points : 41 576
    Points
    41 576
    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).

  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 : 594
    Points
    594
    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 380
    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 380
    Points : 41 576
    Points
    41 576
    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>^>^>^.

  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 : 594
    Points
    594
    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 380
    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 380
    Points : 41 576
    Points
    41 576
    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.

  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 : 594
    Points
    594
    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 380
    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 380
    Points : 41 576
    Points
    41 576
    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...

  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 : 594
    Points
    594
    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 : 594
    Points
    594
    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, 10h48
  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, 11h07
  3. Regrouper une liste en liste de listes
    Par West01 dans le forum Prolog
    Réponses: 12
    Dernier message: 14/03/2008, 14h07
  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, 10h21
  5. Trier une liste en comparant des doubles
    Par babylone7 dans le forum Langage
    Réponses: 10
    Dernier message: 03/05/2007, 10h38

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