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 :

[C++ -> C#] Struct et arrays


Sujet :

C++/CLI

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 76
    Par défaut [C++ -> C#] Struct et arrays
    Bonjour,

    J'ai besoin d'adapter un morceau de code interfaçant un driver, écrit sous C++, dans le but de faire le fonctionner sous C#. Maintenant, je suis capable de le compiler et le faire travailler sans problème sous C++, mais je ne vois pas comment le faire avec C#.

    Bref, la difficulté se trouve en le passe d'une struct comme un paramètre de une fonction C#.

    La struct (qui elle-même contient une autre struct) ressemble le suivant:

    Sous 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
    struct {    
    	short s11;    
    	short s12;    
    	short s13;    
    	short s14;    
    	struct2 sa[20]    
    } struct1    
     
    struct{    
    	long l21;    
    	long l22;    
    	long l23;    
    	long l24;    
    	short s21;    
    	short s22;    
    	short s23;    
    	short s24;	    
    } struct2
    Sous C# (En adaptant le type long au type int, pour le faire occuper 4 bytes)
    =======

    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
    struct {      
    	short s11;      
    	short s12;      
    	short s13;      
    	short s14;      
    	struct2 sa[20]      
    } struct1      
     
    struct{      
    	int l21;  		// long sous C++ --> int sous C# (4 bytes)    
    	int l22;      
    	int l23;      
    	int l24;      
    	short s21;      
    	short s22;      
    	short s23;      
    	short s24;	      
    } struct2
    et le fonction est pareille à la suivante:

    Sous C++
    =======

    Declaration...
    -----------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int function1 (struct1* pStruct1);
    Appel...
    --------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int1 = function1 (&pStruct1);		// Une fois la pStruct1 remplie avec les données
    Sous C# (Les problèmes arrivent):
    ========================

    Declaration...
    -----------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [DllImport(_dllLocation)]            
    public static extern int function1(    
                struct1 pStruct1,    
    );
    Appel...
    -------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int1 = StaticClass.function1(pStruct1);	// Une fois la pStruct1 remplie avec les données
    ***********************

    J'ai essayé des differentes possibilités, mais sans aucun réponse satisfaisante

    1) En déclarant...
    Avant la struct...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [StructLayout(LayoutKind.Sequential, Pack=1, Size=488)] / Size=24)]
    Entre les champs de la struct...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [FieldOffset(0)] / [FieldOffset(2)] / ...
    Je reçois une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HRESULT "(HRESULT Exception: 0x80070057 (E_INVALIDARG))"
    2) En déclarant...
    Avant le struct array...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [MarshalAs(UnmanagedType.SafeArray,SizeConst=20)
    Je reçois la même erreur

    3) En laissant pStruct déclarée seulement, mais sans la remplir avec d'information, la fonction me laisse l'appeler, mais je n'observe pas de fonctionnement.

    Je serais très remercié de pouvoir recevoir n'importe quelle aide / recommandation, car je me trouve maintenant bloqué et je ne sais pas comment suivre.

    Merci de vos réponses.

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 76
    Par défaut
    Résolu,

    Mais la solution n'a été pas évidente. Il fallait, déclarer l'array, en lieu de comme un array, comme une suite de types simples, c'est à dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct2 sa00;  
    struct2 sa01;  
    struct2 sa19;
    en lieu de:
    Et après, transformer les pointeurs de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IntPtr intptrstruct = Marshal.AllocHGlobal(Marshal.SizeOf(sa));  
    Marshal.StructureToPtr(sa, intptrstruct, false);
    J'espère que ma solution pourra aider quelqu'un.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/09/2013, 21h45
  2. Segmentation fault - Struct d'array
    Par AlbinOSG dans le forum C
    Réponses: 9
    Dernier message: 07/12/2011, 12h46
  3. uniform struct array ?
    Par adtunum dans le forum OpenGL
    Réponses: 1
    Dernier message: 13/06/2010, 01h39
  4. Réponses: 1
    Dernier message: 05/06/2007, 18h46
  5. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25

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