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

Développement Windows Discussion :

Wrapping WinRT: Tableau, pointeur, "hat"


Sujet :

Développement Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Par défaut Wrapping WinRT: Tableau, pointeur, "hat"
    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:
    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)
    {
    Avec creal_T :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    double re;
    double im;
    } creal_T;
    J'ai donc différent paramètres en entrée (Mag[], MagEarth[], threshold) et en sortie (Bias_Data[], Bias_size[], Ainv[], ResultCalib)
    que je dois "traduire" pour mon wrapping. J'ai donc essayer le wrapping suivant:

    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);
    }
    J'ai réussi à compiler et déployer l'application sur mon Lumia 830, mais quand j'execute ma fonction "MagCalib" -> AccessViolation reading location ...
    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.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Par défaut
    J'ai finalement réussi à faire passer mes datas de " Platform::Array<double> ^*biasData " du c++ vers mon app C#
    J'ai procédé comme cela: (Code du wrapper WinRT c++)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double bData[3] = { 0,0,0 };
    	auto temp = ref new Array<double>(3);
    	MagCalParameters(mag->Data, magEarth->Data, threshold, bData, bSize, aInv, resultCalib);
    	temp[0] = bData[0];
    	temp[1] = bData[1];
    	temp[2] = bData[2];
    	*biasData = temp;
    Source: https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx

    Par contre je suis toujours bloqué sur un point. Je n'arrive pas à définir un Array avec ma structure ("Platform::Array<creal_T> ^* aInv). Il me rejette en me disant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	1	IntelliSense: the element type of a Platform::Array must be a handle or value type
    Quelqu'un a une idée?

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