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++/CLI Discussion :

Tableau de structure en C et une classe en C#


Sujet :

C++/CLI

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Tableau de structure en C et une classe en C#
    Bonjour,

    J'aurai aimé savoir si il était possible d'échanger entre une dll developpée en C et un programme C# un tableau de structure.

    Rien ne vaut un exemple pour ce faire comprendre :
    structure en C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct Entree{
    	int numseq;
    }Rec;
    Fonction C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    extern "C" __declspec(dllexport) void * Hello()
    {
    	Rec * s = (struct Entree*)malloc(4*sizeof(struct Entree));
            return s;
    }
    Coté C# :
    Ma classe correspondante :
    Code : 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
    [StructLayout(LayoutKind.Sequential)] 
    public class Entree
    { 
    	public Int32 numseq;
    }
     
    Fonction C# réalisant le marshaling :
    private void button1_Click(object sender, System.EventArgs e)
    {
            IntPtr handle = Hello();
    	AdresseIn[] s = new AdresseIn[10];
    	s[0] = new AdresseIn();
    	s[1] = new AdresseIn();
    	s[2] = new AdresseIn();
    	s[3] = new AdresseIn();
    	Marshal.PtrToStructure(handle, s);
    }
    Erreur lors de l'execution :
    La structure specifié doit etre blittable ou avoir des informations de disposition.

    Je ne vois pas l'erreur
    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    car sinon c'est difficilement lisible

    mais au fait, qu'est-ce que le Hello() ? et qu'est AdresseIn ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Dsl pour les balises;

    la fonction Hello() alloue l'espace mémoire de ma structure coté C

    Et effectivement lorque j'ai copié collé mon code j'ai pas fait attention au nom de ma classe.

    Je reprends le code coté c#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [StructLayout(LayoutKind.Sequential)] 
    public class Entree
    { 
    	public Int32 numseq;
    }
    Fonction C# réalisant le marshaling :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void button1_Click(object sender, System.EventArgs e)
    {
            IntPtr handle = Hello();
    	Entree[] s = new Entree[10];
    	s[0] = new Entree();
    	s[1] = new Entree();
    	s[2] = new Entree();
    	s[3] = new Entree();
    	Marshal.PtrToStructure(handle, s);
    }
    Merci de la remarque

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Salut Mouti !

    Désolé je n'ai pas de solution mais ton sujet m'intéresse !

    Si tu trouves une solution, n'oublie pas de la mettre ici, je crois que ça me servira un jour ou l'autre

    ++

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Salut,

    La seul solution que j'ai trouvé est de créer un handle sur mon tableau de structure et d'appeler recursivement une fonction C avec l'index du tableau.

    Et cela ne marche pas super encore.

    Des que j'ai une solution qui tourne Nikel, je post

    @+

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Solution :
    soit la structure C suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct  S_TEL
    { 
      int val; 
      int telfixe; 
    } MyStruct;
    et la fonction allouant l'espace mémoire (coté C) et la fonction permettant de recuperer ma structure :
    Code : 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
     
    void * alloc ()
    {
       MyStruct* sTel = (struct S_TEL*) malloc(100 * sizeof(struct S_TEL));
    // 100 etant la taille de mon tableau
     
    }
     
    //Fct recuperant le pointeur sur un élément de mon tableau de structure
    void * GetTel(int IndexTableau, MyStruct* sTel)
    {
       return &sTel[IndexTableau]; 
    }
     
    //Fct de libération de mémoire:
    void FreeTbl(MyStruct* sTel)
    {
        free(sTel);
    }

    Maintenant côté C# :
    Code : 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
    22
    23
    24
    25
    26
    27
    28
    29
     
    [StructLayout(LayoutKind.Sequential)] 
    public class MaStructTelCSharp 
    { 
        public int val; 
        public int telFixe; 
    }
     
    //Declaration des fct
    [ DllImport("strTel.dll", SetLastError=true) ]		
    static extern IntPtr Alloc();
    [ DllImport("strTel.dll", SetLastError=true) ]		
    static extern IntPtr GetTel(int index, IntPtr Hdl);
    [ DllImport("strTel.dll", SetLastError=true) ]		
    static extern void FreeTbl(IntPtr Handle);
     
    //Allocation de ma structure + recup des éléments de mon tableau de structure:
    private void button1_Click(object sender, System.EventArgs e)
    {
         MaStructTelCSharp[] MyTbl = new MaStructTelCSharp[100];
         IntPtr Handle = Alloc( );
         for (int i = 0; i < 100; i++) //100 = taille de mon tbl
         {
              IntPtr HandleOut = GetTel(i, Handle);
              Marshal.PtrToStructure(HandleOut , MyTbl[i]);
         }
         FreeTbl(Handle);
         ...
    }
    Ne pas oublié de libérer la mémoire

    @+

    Et si qq un à une solution plus simple pour recuperer direct le tbl sans passer par une boucle je suis preneur

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    j'ai pas tout lu, mais ptete que tu trouveras des infos sur ce blog http://blog.developpez.com/index.php?blog=140

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/11/2012, 16h11
  2. Un tableau associatif avec les éléments d'une classe
    Par renaud26 dans le forum jQuery
    Réponses: 2
    Dernier message: 29/11/2011, 07h07
  3. Structure et Organisation d'une classe
    Par BenoitM dans le forum Débuter
    Réponses: 3
    Dernier message: 29/06/2011, 09h28
  4. tableau de combobox et textbox dans une classe
    Par hamedi1 dans le forum C#
    Réponses: 1
    Dernier message: 08/02/2010, 18h22
  5. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 16h00

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