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 ?