Salut,
Je rencontre des difficultés dans le développement de mon application Windows Phone 8.1 Silverlight.
Ce que je chercher à faire est de pouvoir utilisé du code natif C++ dans mon application C#.
Pour ce faire j'ai donc:
- ajouté un projet Windows Runtime Component (8.1 Silverlight) à ma solution de Visual Studio 2013.
- ajouter le code C++ native dans mon projet
- construis un wrapper pour ma fonction à exporter
Pour vérifier le bon fonctionnement de ma dll depuis mon App j'ai fais une fonction simple (somme a+b). Tout fonctionne parfaitement.
Maintenant le problème vient avec le wrapping de ma fonction. Voici le prototype de ma fonction C++ à wrapper:
Avec creal_T :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void MagCalParameters( const double Mag[16503], const double MagEarth[3], double threshold, double Bias_data[], int Bias_size[1], creal_T Ainv[9], double *ResultCalib) {
J'ai donc différent paramètres en entrée (Mag[], MagEarth[], threshold) et en sortie (Bias_Data[], Bias_size[], Ainv[], ResultCalib)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct { double re; double im; } creal_T;
que je dois "traduire" pour mon wrapping. J'ai donc essayer le wrapping suivant:
J'ai réussi à compiler et déployer l'application sur mon Lumia 830, mais quand j'execute ma fonction "MagCalib" -> AccessViolation reading location ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void Wrapper::MagCalib( const Platform::Array<double>^ mag, const Platform::Array<double>^ magEarth, double threshold, Platform::Array<double> ^*biasData, int *bSize, Platform::Array<double> ^* aInv, double *resultCalib) { MagCalParameters(mag->Data, magEarth->Data, threshold, (double*)biasData, bSize, (double*)aInverse, resultCalib); }
Après maintes recherches sur google, il semble que cela doit venir d'un problème de pointeur.
J'ai donc tester chacun de mes paramètres seul, un à un.
mag, magEarth, threshhold, bSize et resultCalib fonctionne parfaitement comme attendu.
Le problème vient de biasData (sortie) et de aInv(sortie). Pour aInv une partie du problème rencontré et que je ne peux pas choisir ma struc pour mon Array ( Platform::Array<creal_T> ^* aInv)
Je rencontre donc un problème pour faire passer mon tableau en C++ via mon WinRT (C++/CLI) pour l'utiliser après dans mon app (C#).
Les algorithmes de ma fonction "MagCalParameters" sont générés via Matlab Coder qui permet de transcrire mes algorythmes Matlab en C/C++. Je n'ai aucun doute quant à la fiabilité des algo générés. Mon problème est très certainement dû à mon wrapper ou encore à l'utilisation des pointeurs et hat (^) que j'ai pu mettre en place.
Il se pourrait peut-être que le problème vienne aussi du coté app (C#) quant à l'utilisation de code non-managé.
En tout cas je suis un peu dans le flou sur ces histoires de wrap, je doute également sur l'utilisation de "Plateform::Array" pour faire mes tableaux. J'espère que vous pourrez m'aider sur la réalisation de ce wrapper au tout autre réflexion pouvant m'aider à avancer.
Mathieu.
Partager