none
Liste de liste du c++/cli vers c# RRS feed

  • Question

  • Bonsoir,

    J'ai une bibliothèque C++ qui calcule toute sorte de courbes.

    Dans le module CLR qui fait la conversion pour l'exécutable C#
    J'ai une fonction qui retourne le dessin de la courbe continue, une succession de point, sans problème.

    C'est la fonction getCourbe

    ICollection<CLITestGeom::IPoint^> ^ CLRProfil::getCourbe(String ^p_Courbe, int p_NbPt)
    {
            cliext::vector<CLITestGeom::IPoint^> ^aVector = gcnew cliext::vector<CLITestGeom::IPoint^>();
            for each (GP79::Xpoint ptx in m_Profil->getCourbe(marshal_as<std::wstring>(p_Courbe), p_NbPt))
            {
                aVector->push_back(gcnew XCLIPoint(ptx.X, ptx.Y, ptx.Z));
            }
            return aVector;
    }

    Je voudrais transmettre les vecteurs tangents à cette courbe, c'est à dire une liste de liste de 2 points.

    ICollection<ICollection<CLITestGeom::IPoint^>^>^  CLRProfil::getFigures(wstring p_Repere, const int p_NbPT)
    {
       cliext::vector<cliext::vector<CLITestGeom::IPoint^> ^> ^ l_Rslt =
      gcnew cliext::vector<cliext::vector<CLITestGeom::IPoint^> ^>();

       for each (vector<GP79::Xpoint> lstX in m_Profil->getFigures(marshal_as<std::wstring>(p_Repere), p_NbPT))
       {
                cliext::vector<CLITestGeom::IPoint^> ^lstPt = gcnew cliext::vector<CLITestGeom::IPoint^>();
                for each (GP79::Xpoint ptx in lstX)
                {
                    lstPt->push_back(gcnew XCLIPoint(ptx.X, ptx.Y, ptx.Z));
                }
                l_Rslt->push_back(lstPt);
       }        
       return l_Rslt;
    }

    Le compilateur se bloque sur la dernière ligne de la fonction,  sur le return l_Rslt, avec le message suivant:

    Error    C2440    'return': cannot convert from 'cliext::vector<cliext::vector<CLITestGeom::IPoint ^> ^> ^' to 'System::Collections::Generic::ICollection<System::Collections::Generic::ICollection<CLITestGeom::IPoint ^> ^> ^'    CLITestGeom    C:\Production\ApplicationTest\CLITestGeom\CLRProfil.cpp

    Vous avez certainement une idée.

    Gérard

    samedi 20 février 2016 22:48

Réponses

  • Teodora, merci pour vos indications

    J'ai trouvé une solution, c'est celle que je voulais éviter, créer une classe à la place de la classe std::vector.
    J'ai crée une classe Ligne, une interface ILigne et une fonction de conversion marshal_as du c++ vers managé. Il faut utiliser les interfaces. La classe Ligne contient des objets IPoint.

    Voici le code:

    namespace CLITestGeom
    {
        public interface class IPoint
        {
            property double X;
            property double Y;
            property double Z;

        };

        public ref class XCLIPoint : IPoint
        {
            double m_X;
            double m_Y;
            double m_Z;

            void init();

        public:

            XCLIPoint();
            XCLIPoint(const XCLIPoint ^ptx);
            XCLIPoint(const double p_X, const double p_Y, const double p_Z);
            
            XCLIPoint % operator=(const XCLIPoint% orig);
            
            property double X
            {
                virtual double get() { return m_X; }
                virtual void set(double p_X ) { m_X = p_X; }
            };

            property double Y
            {
                virtual double get() { return m_Y; }
                virtual void set(double p_Y) { m_Y = p_Y; }
            };

            property double Z
            {
                virtual double get() { return m_Z; }
                virtual void set(double p_Z) { m_Z = p_Z; }
            };

        };

    }

    namespace CLITestGeom
    {
        public interface class ILigne
        {
            property IPoint ^Debut;
            property IPoint ^Fin;
        };

        public ref class Ligne: public ILigne
        {
            XCLIPoint ^m_Pt1;
            XCLIPoint ^m_Pt2;

        public:
            Ligne();
            ~Ligne();
            Ligne(Ligne ^p_Ligne);
            Ligne(XCLIPoint ^p_Pt1, XCLIPoint ^p_Pt2);

            property IPoint ^Debut
            {
                virtual IPoint ^ get() { return safe_cast<IPoint ^>(m_Pt1); }
                virtual void set(IPoint ^ p_X) { m_Pt1 = safe_cast<XCLIPoint ^>(p_X); }
            };

            property IPoint ^Fin
            {
                virtual IPoint ^ get() { return safe_cast<IPoint ^>(m_Pt2); }
                virtual void set(IPoint ^ p_X) { m_Pt2 = safe_cast<XCLIPoint ^>(p_X); }
            };

        };

    }

    namespace msclr {
        namespace interop {
            template<>
            inline CLITestGeom::Ligne^ marshal_as<CLITestGeom::Ligne^, GP79::Alignement>(const GP79::Alignement &from)
            {
                return
                    gcnew CLITestGeom::Ligne(
                        gcnew CLITestGeom::XCLIPoint(from.Debut.X, from.Debut.Y, from.Debut.Z),
                        gcnew CLITestGeom::XCLIPoint(from.Fin.X, from.Fin.Y, from.Fin.Z));
            }
        }
    }

    namespace CLITestGeom
    {
        ICollection<ILigne ^>^ CLRProfil::getFigures(String ^p_Repere, const int p_NbPT)
        {
            cliext::vector<ILigne ^> ^ l_Rslt = gcnew cliext::vector<ILigne ^>();
            for each (GP79::Alignement l_Droite in m_Profil->getLigne(marshal_as<std::wstring>(p_Repere), p_NbPT))
            {            
                l_Rslt->push_back(safe_cast<ILigne ^>(marshal_as<CLITestGeom::Ligne ^ >(l_Droite)));
            }
            return l_Rslt;
        }
    }

    A quoi ça sert?

    Cela me permet de récupérer et d'afficher tous les segments de couleur verte au dessus de la courbe.
    En l'occurrence il s'agit d'une courbe de Joukowsky.

    Cordialement
    Gérard

    • Marqué comme réponse GP79 lundi 22 février 2016 11:21
    lundi 22 février 2016 11:21

Toutes les réponses

  • Bonjour, Gérard,

    Veuillez consulter le lien en bas :

    Compiler Error C2440

    Je vous remercie par avance de votre retour.

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    dimanche 21 février 2016 19:48
    Modérateur
  • Teodora, merci pour vos indications

    J'ai trouvé une solution, c'est celle que je voulais éviter, créer une classe à la place de la classe std::vector.
    J'ai crée une classe Ligne, une interface ILigne et une fonction de conversion marshal_as du c++ vers managé. Il faut utiliser les interfaces. La classe Ligne contient des objets IPoint.

    Voici le code:

    namespace CLITestGeom
    {
        public interface class IPoint
        {
            property double X;
            property double Y;
            property double Z;

        };

        public ref class XCLIPoint : IPoint
        {
            double m_X;
            double m_Y;
            double m_Z;

            void init();

        public:

            XCLIPoint();
            XCLIPoint(const XCLIPoint ^ptx);
            XCLIPoint(const double p_X, const double p_Y, const double p_Z);
            
            XCLIPoint % operator=(const XCLIPoint% orig);
            
            property double X
            {
                virtual double get() { return m_X; }
                virtual void set(double p_X ) { m_X = p_X; }
            };

            property double Y
            {
                virtual double get() { return m_Y; }
                virtual void set(double p_Y) { m_Y = p_Y; }
            };

            property double Z
            {
                virtual double get() { return m_Z; }
                virtual void set(double p_Z) { m_Z = p_Z; }
            };

        };

    }

    namespace CLITestGeom
    {
        public interface class ILigne
        {
            property IPoint ^Debut;
            property IPoint ^Fin;
        };

        public ref class Ligne: public ILigne
        {
            XCLIPoint ^m_Pt1;
            XCLIPoint ^m_Pt2;

        public:
            Ligne();
            ~Ligne();
            Ligne(Ligne ^p_Ligne);
            Ligne(XCLIPoint ^p_Pt1, XCLIPoint ^p_Pt2);

            property IPoint ^Debut
            {
                virtual IPoint ^ get() { return safe_cast<IPoint ^>(m_Pt1); }
                virtual void set(IPoint ^ p_X) { m_Pt1 = safe_cast<XCLIPoint ^>(p_X); }
            };

            property IPoint ^Fin
            {
                virtual IPoint ^ get() { return safe_cast<IPoint ^>(m_Pt2); }
                virtual void set(IPoint ^ p_X) { m_Pt2 = safe_cast<XCLIPoint ^>(p_X); }
            };

        };

    }

    namespace msclr {
        namespace interop {
            template<>
            inline CLITestGeom::Ligne^ marshal_as<CLITestGeom::Ligne^, GP79::Alignement>(const GP79::Alignement &from)
            {
                return
                    gcnew CLITestGeom::Ligne(
                        gcnew CLITestGeom::XCLIPoint(from.Debut.X, from.Debut.Y, from.Debut.Z),
                        gcnew CLITestGeom::XCLIPoint(from.Fin.X, from.Fin.Y, from.Fin.Z));
            }
        }
    }

    namespace CLITestGeom
    {
        ICollection<ILigne ^>^ CLRProfil::getFigures(String ^p_Repere, const int p_NbPT)
        {
            cliext::vector<ILigne ^> ^ l_Rslt = gcnew cliext::vector<ILigne ^>();
            for each (GP79::Alignement l_Droite in m_Profil->getLigne(marshal_as<std::wstring>(p_Repere), p_NbPT))
            {            
                l_Rslt->push_back(safe_cast<ILigne ^>(marshal_as<CLITestGeom::Ligne ^ >(l_Droite)));
            }
            return l_Rslt;
        }
    }

    A quoi ça sert?

    Cela me permet de récupérer et d'afficher tous les segments de couleur verte au dessus de la courbe.
    En l'occurrence il s'agit d'une courbe de Joukowsky.

    Cordialement
    Gérard

    • Marqué comme réponse GP79 lundi 22 février 2016 11:21
    lundi 22 février 2016 11:21