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 :

marshaller un tableau de taille fixe dans une structure


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Par défaut marshaller un tableau de taille fixe dans une structure
    Bonjour,

    Je souhaiterais marshaller la structure C++ suivante

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct MyStruct
    {
      int i1;
      BYTE array[20]
      int i2;
    };

    cette structure c++ fait 28 octects

    Voici la solution C# pour laquelle j'avais opté sans succès:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [StructLayout(LayoutKind.Explicit, Size = 28)]
    public struct MyStruct
    {
        [FieldOffset(0)]
        public Int32 i;
        [FieldOffset(4)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
        public Byte[] byteArray;
        [FieldOffset(24)]
        public Int32 i2;
    }
    Cette structure fais bien 28 octects, mais le probleme se situe au niveau du tableau de Byte. En effet, ce champs se comporte comme un pointeur vers un tableau de Byte plutot que comme un tableau de Byte "embarqué" dans la structure.

    Que puis-je faire pour remédier à ce problème ? (Je travail en CF .NET)

    Merci pour votre aide

  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 : 43
    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
    Par défaut
    Essaie comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [StructLayout(LayoutKind.Explicit, Size = 28)]
    public struct MyStruct
    {
        [FieldOffset(0)]
        public Int32 i;
        [FieldOffset(4)]
        public fixed Byte byteArray[20];
        [FieldOffset(24)]
        public Int32 i2;
    }
    Ca devrait marcher si tu es sur du .NET 2.0 ou supérieur

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Par défaut
    merci Tomlev, ta solution marche.

    Par contre, cela necéssite que je passe en contexte unsafe. Jusqu'à présent, je me suis toujours interdit d'utilisé un contexte unsafe car je ne souhaitais pas avoir à gérer la mémoire.

    dans ce cas précis, je suppose que je n'ai rien à gérer si j'utilise des objets de ce type, mais peux-tu me le confirmer ? est-ce que le garbage collector libérera la mémoire occupé par ces objets ?

    exemple :
    { // On entre dans un bloc de code
    MyStruct ms;
    ......
    } // On sort du bloc de code
    --> est-ce que la memoire de ms est bien gérée par le garbage collector ?

    Merci

  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 : 43
    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
    Par défaut
    Bizarre que ton code initial n'ai pas fonctionné... pourtant, Marshal.SizeOf renvoie bien 28 sur ta structure initiale, ce qui montre que le tableau de bytes est bien embarqué dans la structure. Mais il y a peut-être des spécificités du Compact Framework que je ne connais pas...

    Citation Envoyé par yocks Voir le message
    Par contre, cela necéssite que je passe en contexte unsafe. Jusqu'à présent, je me suis toujours interdit d'utilisé un contexte unsafe car je ne souhaitais pas avoir à gérer la mémoire.

    dans ce cas précis, je suppose que je n'ai rien à gérer si j'utilise des objets de ce type, mais peux-tu me le confirmer ? est-ce que le garbage collector libérera la mémoire occupé par ces objets ?
    Le contexte unsafe n'est pas lié à la façon de gérer la mémoire : elle est gérée par le GC, comme d'habitude. Par contre, ça t'autorise à faire des choses qui pourraient potentiellement être dangereuses, parce que le CLR ne peut pas les vérifier (manipulation de pointeurs, accès direct à la mémoire sans contrôle du CLR...)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Par défaut
    Si la structure de mon premier code fais 28 octects, c'est que je l'ai forcée à 28 octects avec le structLayout, mais en fait son comportement reste identique à celui-ci qu'il aurais sans StructLayout (=LayoutKind.Auto), c'est à dire avec une taille de 12 Octects.

    Merci encore pour ta solution et tes explications sur la gestion de la memoire

  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 : 43
    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
    Par défaut
    Citation Envoyé par yocks Voir le message
    Si la structure de mon premier code fais 28 octects, c'est que je l'ai forcée à 28 octects avec le structLayout
    Pourtant en enlevant le Size = 28 de l'attribut StructLayout, la structure fait toujours 28 octets... donc il doit bien prendre en compte l'attribut MarshalAs

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 29/03/2014, 09h36
  2. [AC-2007] Tableau de taille variable dans une feuille d'état
    Par spawny161184 dans le forum VBA Access
    Réponses: 3
    Dernier message: 14/11/2011, 11h29
  3. [AC-2007] Tableau de taille variable dans une feuille d'état
    Par spawny161184 dans le forum IHM
    Réponses: 0
    Dernier message: 08/11/2011, 08h55
  4. Réponses: 2
    Dernier message: 20/06/2010, 17h02
  5. FieldInfo et "fixed" dans une structure
    Par pcayrol dans le forum C#
    Réponses: 4
    Dernier message: 28/01/2008, 12h01

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