Tableaux et C++ managé :(

pma3d Messages postés 36 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 14 septembre 2005 - 20 juin 2005 à 11:18
pma3d Messages postés 36 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 14 septembre 2005 - 21 juin 2005 à 09:22
Bonjour à tous,



Comme le dit l'intitulé du post, j'ai des problèmes concernant
la gestion des tableaux en c++ managé. Je ne sais pas si c'est le bon
forum (sur cppfrance, toutes les questions posées sur le c++ managé
sont renvoyées ici), alors je me lance.

Concrètement, je dispose d'une dll contenant des méthodes
implémentées en c++ non managé, et je dois réaliser une classe
d'encapsulation pour pouvoir les utiliser en .NET. Une méthode en
particulier me pose problème : elle prend en argument un tableau de
double (double*) et renvoie un tableau de double (double*).

Comme vous le devinez, je n'arrive pas à faire en sorte que
cette méthode travaille avec un tableau déclaré en double __gc[].

Alors, j'ai passé pas mal de temps à chercher des infos, en
particuliler sur la msdn, mais je trouve que ce n'est pas clair du
tout... Je suppose que le marshaling est la clé de mon problème, mais
comme je viens tout juste de me mettre à .Net, j'ai beaucoup de mal.

Merci d'avance à tous ceux qui me répondront, ou qui m'ont au moins lu jusqu'au bout...

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 juin 2005 à 15:52
Salut, bon j'avais ecrit un texte assez long pour t'expliquer comment j'aurais fait en C# pour passer le tableau et que c'etait pas facile pour le recuperer.. Mais bon au moment de le poster il a disparu dans le vide interstellaire : )

Je ne connais pas le C++ manage mais normalement ca force c'est de pouvoir mixer le code natif et le code manage, alors pourquoi ne pas appeler ta fonction en natif et apres copier chaque elements dans ton __gc[ ] ?
0
pma3d Messages postés 36 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 14 septembre 2005
20 juin 2005 à 16:16
Ben oui, j'aimerais bien justement et j'ai essayé par pas mal de moyens
possibles, au moins pour voir marcher mon service web, bien que ce ne
soit pas tout à fait le travail qui m'est demandé.

Le problème est que lorsque j'utilise ma fonction en double*, il me lance une exception :

System.Double* est inaccessible en raison de son niveau de protection. Seuls les types public peuvent être traités.


Et il me fait la même chose si j'utilise un 'double
__nogc[]' (__nogc signifiant que le tableau n'est pas géré
dynamiquement, c'est l'exact equivalent de double[] ou double*).

Donc, j'en suis réduit à utiliser des double __gc[], ce qui tombe bien
puisque c'est ce qu'on me demande ! Mais c'est pas facile... Et le plus
dérangeant dans tout ça, c'est que personne ne semble savoir faire ça :
pas un tutorial, pas une explication sur le net. Je commence même à me
demander si le C++ managé peut vraiment totalement être mixé avec le
vrai C++
0
pma3d Messages postés 36 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 14 septembre 2005
20 juin 2005 à 16:57
Bon, finalement, c'est bon. Merci lutinore, tu m'as mis sur la voie,
d'ailleurs, après réflexion, tu y étais presque, mais comme tu ne
connaissais pas mon programme, tu ne pouvais pas faire autrement.

Donc, j'ai fait quelque chose qui marche, mais qui je ne trouve
vraiment pas propre : en fait, j'utilise bien un tableau __gc[] en
entrée de ma méthode, tableau que je convertis en double* dans
la méthode, je fais alors appel à ma méthode native avec ce nouveau
tableau, et que je reconverti en __gc[] avant de le renvoyer.

Je n'aime pas ce genre de solutions 'bidouille', mais ça a le mérite de marcher.

Maintenant, reste à voir ça au niveau performances, parce que mon
programme risque d'être utilisé de manière très très intensive, et j'ai
peur que les boucles de conversion plombent un peu tout ça.

Et puis, en plus, comme ça ne colle pas tout à fait avec ce qui m'est
demandé, je ne sais pas si mon tuteur va accepter cette solution. On
verra bien !
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 juin 2005 à 17:33
Y'a qu'a voir les sources de Quake II en .Net pour etre sur que le MC++ est "mixable" idem pour les classes du framework.. Mais c'est pas un language facile.. Peut etre qu'avec le prochain C++ qui ne sera pas des extensions managees mais un vrai language .Net ce sera plus intuitif..

Il est etrange ton message d'erreur, c'est comme si les types double* etaient declares en private !?

System.Double* c'est un type manage ca..

Plutot que d'utiliser __nogc[ ] tu ne peux pas utiliser du VRAI C++, avec qlq' chose comme #pragma unmanaged ou je ne sais pas quoi.. ( Je rappelle que je ne code pas en MC++ )


En C# pour passer un tableau de double* j'aurais alloue un buffer avec Marshal.AllocCoTaskMem avant de passer le buffer par reference ( keyword : ref )
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pma3d Messages postés 36 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 14 septembre 2005
20 juin 2005 à 17:50
Eheh, le truc drôle c'est que moi non plus je ne codais pas en MC++ il
y a une semaine... Je ne savais même pas ce qu'était 'managé' et 'non
managé' !! Et je connais encore moins C#... Alors j'ai beaucoup
beaucoup de mal à avancer.

Pour l'utilisation de vrai c++, #pragma unmanaged, c'est du chinois
pour moi... Parce que, oui, je ne connaissais c++ que de nom il y a 15
jours... En fait, je m'en sors grâce à mes connaissances que je juge
avancées en C et Java, mais malheureusement, je ne peux me débrouiller
qu'en surface. J'ai bien vu des #pragma traîner dans certains sources,
mais comme j'ai autre chose à faire, je ne prends pas le temps de
regarder ce que fait chaque mot clé que je ne connais pas.

Bref, merci encore lutinore !!
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 juin 2005 à 18:13
Ah ok..

Et encore tu es bon en C, je souhaite bien du courage a celui qui veut commencer la programmation avec MC++ :D

Plutot que d'apprendre les extensions managees de C++ qui seront bientot remplacer.. Tu devrais apprendre le C# ou le J# surtout si tu travailles avec des web services.. Vu que tu es bon en C et que tu connais le principe du GC et des types manages, bha on peut dire que tu sais deja programme en CSharp : )

a+
0
pma3d Messages postés 36 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 14 septembre 2005
21 juin 2005 à 09:22
lol, c'est clair que j'ose même pas imaginer commencer avec ça !!

En fait, je fais un peu des deux. Comme je suis en train d'étudier les
services web, j'ai le service web (qui utilise les classes développées
par ma boîte en C++ depuis plusieurs années, donc obligation de faire
du MC++), par contre, côté client, comme je n'ai aucune contrainte, je
développe en c#... et c'est vrai que c'est quand même plus agréable.

Bref, merci de ton aide, en tous cas, ce forum est super : efficace et rapide, que du bonheur !

a+
0
Rejoignez-nous