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 :

c# interopérabilité et vectors


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 457
    Par défaut c# interopérabilité et vectors
    Salut,


    Je galère un peu à ce niveau et j'aimerai mieux comprendre le fonctionnement, j'ai testé différentes choses, maintenant j'arrive a récupérer un tableau du côté c#, par contre comment on détruit le pointeur qui a été initialisé ?
    Quand j'utilise Marshal.FreeCoTaskMem le code s'arrête côté c#, donc visiblement ça ne doit pas lui plaire. J'ai réussi en bataillant pas mal que ça soit du côté c++/cli ou c++ en unmanaged si j'ai bien compris, à pouvoir exploiter ça sous c# c'est un peu la dernière étape avant de faire des choses plus complexes, et là j'ai du mal à capter.

    Côté C++ comme on peut voir j'ai testé aussi avec maloc

    Code C++ : 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
    extern "C" __declspec(dllexport) bool ArraySample(/*ItemListHandle * hItems*/ double** itemsFound, int* itemCount) {
     
    	//OutputDebugString(L"test");
    	// initialization d'un tableau
    	auto items = new std::vector<double>();
    	for (int i = 0; i < 500; i++)
    	{
    		items->push_back((double)i);
    	}    
     
    	*itemCount = items->size();
    	*itemsFound = items->data();
     
    	/*auto size = (*itemCount) * sizeof(double);
    	itemsFound = static_cast<double*>(malloc(size));
     
    	memcpy(*itemsFound, items->data(), size);*/
     
     
    	return true;
    }

    Pour le C# la version actuelle qui exploite ce tableau:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                IntPtr arrPtr;
                int taille;
     
     
                ArraySample(out arrPtr, out taille);
     
                double[] theArray = new double[taille];
     
                Marshal.Copy(arrPtr, theArray, 0, taille);
                Marshal.FreeCoTaskMem(arrPtr);

    Vu que c'est une copie si je ne me plante pas je dois effacer ce qui a été mis en mémoire par le c++ ? non ?

  2. #2
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Salut daerlnaxe,

    Je ne sais pas si tu as résolu ton problème ou non.
    Voici mon avis, si ça peut t'aider ou d'autres face ce problème.

    Ce qu'il se passe ici c'est que tu demande à ton C# de free quelque chose d'instancier pour le C++. Et ça ce n'est pas possible (à ma connaissance)

    Lorsque c'est comme ça pour ma part, je fais au moins 3 fonctions dans mes DLL:

    • Init() => Qui instancie ce qu'il y a besoin
    • Todo() => Qui réalise ma fonction, donc "ArraySample" pour toi.
    • Clear => Qui fait les free si besoin.



    Sinon l'autre alternative est d'intancier coté c# et de passer le pointeur, mais c'est clairement plus délicat surtout si tu ne connais pas la taille à l'avance.

    Bon courage à toi

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Salut,

    Si je peux te conseiller

    new = delete

    après le pourquoi je te laisse chercher ce sujet est mainte fois revenus, avec et, surtout les avis diverge (parfois avec violence si je puis dire...), c' est ce dernier point qui m'empêche de prendre position.

    Ce qui est fait en c++ reste et doit(devrais?) rester en c++ . pour le C# je passe le relai je maîtrise pas le sujet

Discussions similaires

  1. [Struts] logic:iterate avec un Vector
    Par laurentb dans le forum Struts 1
    Réponses: 18
    Dernier message: 03/03/2004, 14h42
  2. vector et erase()
    Par gytr2 dans le forum SL & STL
    Réponses: 6
    Dernier message: 02/03/2004, 12h45
  3. equivalent Vector du jsp
    Par Djib dans le forum ASP
    Réponses: 4
    Dernier message: 05/12/2003, 08h07
  4. "vector" provoque "syntax error", malgré
    Par seenkay dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/08/2003, 03h21
  5. Réponses: 2
    Dernier message: 11/07/2003, 18h24

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