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# Discussion :

Besoin d'un coup de main pour un problème d'interopérabilité c++ c#


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Besoin d'un coup de main pour un problème d'interopérabilité c++ c#
    Bonjour à tous,

    Je suis actuellement confronté à un problème qui commence à me peser. Je dois utiliser une dll écrite en c++ dans mon programme en c#.
    J'ai pas eu de problème pour la majorité des structures mais là je bloque...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //TextLed structure pour les afficheurs 7 segments
    typedef union
    {
        long n;
     
        struct _text
        {
            char c1,c2,c3;		// caractères 1,2,3
    		char clignotant;	// 1 = "Clignote", 0 = "Normal"
        } t;
     
    } TextLed;
    J'ai essayé ceci (qui me semblait prometteur) mais sans grand résultat.
    Le principe étant d'exploser la structure text pour la replacer char par char
    à sa place dans l'union.

    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
        [StructLayout(LayoutKind.Explicit)]
        public class TextLedStructure
        {
            #region Members
     
            [FieldOffset(0)]
            [MarshalAs(UnmanagedType.I8)]
            public long n;
     
            [FieldOffset(0)]
            public char t_c1;
     
            [FieldOffset(1)]
            public char t_c2;
     
            [FieldOffset(2)]
            public char t_c3;
     
            [FieldOffset(3)]
            public char t_clignotant;
     
            #endregion
        }
    Vous avez une idée? J'avoue que là je sèche un peu.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Tu pourrais déclarer dans la structure un simple tableau de 4 octets, et faire le marshalling à la main...

  3. #3
    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
    C'est une impression ou en C++ un char c'est codé sur 1 octet ?


    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    [StructLayout(LayoutKind.Sequential)]
        public class TextLedStructure
        {
            #region Members
     
            public long n;
            public byte t_c1;
            public byte t_c2;
            public byte t_c3;
            public byte t_clignotant;
     
            #endregion
        }

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    effectivement... Char est sur 2 octets, mais en C++ je ne crois pas que char corresponde à Char

    Par contre il faut préciser les FieldOffset, vu que c'est une union

  5. #5
    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
    Ah bon ?
    Dans les union les structures sont alignées ? je veux dire, les octets ne se suivent pas de manière linéaire ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par smyley Voir le message
    Ah bon ?
    Dans les union les structures sont alignées ? je veux dire, les octets ne se suivent pas de manière linéaire ?
    Ca fait longtemps que j'ai pas fait du C, mais si je me souviens bien, dans une union les éléments de l'union sont tous au même emplacement mémoire. Ca permet d'accéder aux mêmes données de différentes façons (via un long ou via une structure de char dans cet exemple)

  7. #7
    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
    ah c'est à ça que sa sert ...
    Ben dans ce cas, ceci devrais suffire :
    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
     
    [StructLayout(LayoutKind.Explicit)]
        public class TextLedStructure
        {
            #region Members
     
            [FieldOffset(0)]
            [MarshalAs(UnmanagedType.I8)]
            public long n;
     
            [FieldOffset(0)]
            public byte t_c1;
     
            [FieldOffset(1)]
            public byte t_c2;
     
            [FieldOffset(2)]
            public byte t_c3;
     
            [FieldOffset(3)]
            public byte t_clignotant;
     
            #endregion
        }

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci à tous, cela fonctionne bien au niveau des 4 bytes t_c1, t_c2,...
    Me reste un souci avec mon long n qui au sein de la dll c++ semble
    complètement erroné.

    J'ai ceci :

    n = 1684234849
    t.c1 = a
    t.c2 = b
    t.c3 = c
    t.clignotant = d

    alors que mon n devrait être égal à 2.
    Surement encore un petit problème quelque part mais je vais trouver .

    Merci encore

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    En C++ un long fait 32 bits il me semble... alors qu'en C# le mot clé long fait référence au type Int64, donc 64 bits. Il faut donc que tu mettes int ou Int32 à la place de long dans la déclaration C# de la structure.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Oui en effet, tout fonctionne parfaitement maintenant.
    Merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/01/2007, 12h35
  2. Réponses: 7
    Dernier message: 23/12/2006, 13h43
  3. [RegEx] Besoin d'un coup de main pour écrire une regex
    Par gaboo_bl dans le forum Langage
    Réponses: 7
    Dernier message: 18/08/2006, 17h53
  4. besoin d'un coup de main pour une requête ;)
    Par Fabouney dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/11/2005, 23h14

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