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 :

Problème de Cast générique


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Par défaut Problème de Cast générique
    Bonjour,

    Voici mon souci :

    J'ai une classe Modele qui contient un int* pBuffer.

    J'ai aussi défini plusieurs structure STRUCT 1, STRUCT 2, etc...

    J'instancie plusieurs instances de Modele.

    Je veux maintenant caster mon adresseBuffer (pour pouvoir visualiser la valeur des attributs) dans l'une de ces structures et que ce soit générique : c'est à dire je ne veux pas écrire dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STRUCT1* pStruct = (STRUCT1 *) pBuffer;
    Je sais pourtant à quelle structure (STRUCT1 ou STRUCT2) mon pBuffer correspond mais je ne possède l'info que littéralement, à savoir dans un String...

    Comment puis je procéder...

    Merci.

    Pascal

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    Soi plus explicite,

    Je veux maintenant caster mon adresseBuffer
    je suppose que adresseBuffer correspond au int * buffer de ta classe modele.

    Ensuite, tu es sur de faire du C#? Les pointeurs ca fait bizarre.
    Si tu ne veux pas écrire dans le code STRUCT1* pStruct = (STRUCT1 *) pBuffer; alors que veux tu écrire? STRUCT1<int> pStruct = pBuffer?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Par défaut
    Merci pour ta rapidité...

    Je suis obligé d'utiliser des pointeurs car je récupère ce pointeur d'une dll C non managée...

    Ce que je veux faire, c'est afficher les valeurs des attributs d'un pointeur sur un buffer sachant que pour le dit pointeur (une int* je le rappelle), je ne possède qu'en chaine de caractère la structure qui le décrit.

    Est ce clair ou avez vous besoin de plus de détails ?

    Merci encore !

    Pascal

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    J'ai toujours un peu de mal a comprendre le but de l'operation, il faudrait que tu décrive un plus le but de la manip.
    Moi ce que je comprend c'est ca:

    Code c#:
    //Récup d'un pointeur par une méthode non managée
    int * monBuffer = appelMéthodeCNonManagée();

    //monBuffer est une adresse mémoire ou est stocké une structure en chaine de caractère

    fin code c#

    Après je sais toujours pas ce que tu veux faire. Tu veux a priori remplir une structure avec les éléments pointé par monBuffer. Sachant que ces éléments sont sous forme de string, il faut les changer dans le bon type

    C'est ca?
    On comprend pas bien. Il faut absolument donné un exemple de code et le resultat que t'attends de se code. Un truc du style à quoi corresponde tes variables qu'est-ce que te retounrne la fonction C et à quoi servent tes structure et ta classe et que vient faire la généricité dans le tout?

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 602
    Par défaut
    Je crois comprendre, en effet, mais dans ce cas à part une création dynamique de type, il n'y a pas vraiment de solution qui saute aux yeux.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Par défaut
    OK je vais essayer d'être plus clair !

    Struct_A.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public struct Struct_A
    {
       public int Attribut1;
       public float Attribut2;
       public String Attribut3;
    }
    Struct_B.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public struct Struct_B
    {
       public float Attribut1;
       public float Attribut2;
       public bool Attribut3;
    }


    Modele.cs
    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
     
    public class Modele
    {
       int * monBuffer;
     
       public void RecupAdresseBuffer()
       {
          monBuffer = appelMéthodeCNonManagée(); // via un delegate + Invoke() etc...
       } 
     
       public void AfficheInfosBuffer()
       {
          // A ce niveau là, je connais le cast que je veux utiliser (peu vous importe comment je l'ai réupéré...
          // Je le possède sous forme littérale soit String Cast = "Struct_A" ou "Struct_B"
     
          // Ce que je veux :
          // Récupérer la valeur de chaque attribut de mon pointeur monBuffer dans le bon cast...   
       } 
    }
    Main.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static Main
    {
       Modele ModeleTypeA = new Modele();
       Modele ModeleTypeB = new Modele();
     
       ModeleTypeA.RecupAdresseBuffer();
       ModeleTypeB.RecupAdresseBuffer();
     
       ModeleTypeA.AfficheInfosBuffer();
       ModeleTypeB.AfficheInfosBuffer();
    }
    Voilà.

    Merci encore de votre aide...

    Pascal

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    premiere chose, tes pointeurs, tu devrais les manipuler par des IntPtr, c'est fait pour ca.

    Ensuite, si tu connais le type sous forme de chaine, il te suffit de recuperer le type par le nom (Type.GetType(string) de memoire), de passer un coup d'activator pour recuperer une instance, et enfin d'utiliser Marshal.PtrToStructure(IntPtr, Object) pour copier les données. Par contre apres ca devient embettant à manipuler vu que tu ne sauras pas si tu as une Struct1 ou 2.

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 602
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Ensuite, si tu connais le type sous forme de chaine,
    Ah, ok. J'avais compris (sans doute de travers) que la chaine contenait une description du contenu du type (du style : type de données à telle position, etc ...) et que le type devait être reconstruit à partir de ces infos.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Ah, ok. J'avais compris (sans doute de travers) que la chaine contenait une description du contenu du type (du style : type de données à telle position, etc ...) et que le type devait être reconstruit à partir de ces infos.
    C'est ce que j'avais compris au debut aussi ... =D

    C'est le comment du dernier post, qui m'a fait comprendre le fond du truc.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    Et si je comprend bien, un switch(stringType) n'est pas envisageable?

    switch(stringType)
    {
    case "STRUC_A":
    STRUCTA tmpStruct = (STRUCTA)monBuffer;
    break;
    case "STRUCT_B":
    ...
    break;
    }

    Merci pour le code, c'est très clair maintenant, mais il semblerais en effet que pour ne pas passer par un cast, il va falloir suivre la proposition de SirJulio

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Citation Envoyé par mrrenard Voir le message
    Et si je comprend bien, un switch(stringType) n'est pas envisageable?

    switch(stringType)
    {
    case "STRUC_A":
    STRUCTA tmpStruct = (STRUCTA)monBuffer;
    break;
    case "STRUCT_B":
    ...
    break;
    }

    Merci pour le code, c'est très clair maintenant, mais il semblerais en effet que pour ne pas passer par un cast, il va falloir suivre la proposition de SirJulio
    Si, si, tu peux aussi, mais la finalité est la meme, puisqu'il va falloir renvoyer une valeur, et la commune à structA et B, c'est object.

    Le mieux à faire (du moins si c'est possible) pour eviter toute la phase manipulation à grand coup de reflection (glups !), c'est de faire deux methodes encapsulant le meme appel natif mais l'un envoyant une structA l'autre B.

    Bref, de toutes facons, ca va etre chiant à mettre en place, de par le fait que ce soit des struct (pas d'abstract etc ) et que les deux types sont vraiment tres differents.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Par défaut Merci SirJulio pour Marshal.PtrToStructure mais...
    il reste une c. dans le pâté...

    J'ai fait un petit test pour vous expliquer où j'en suis et quel est le dernier petit (?) problème à résoudre...

    Struct.cs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)]
        public struct TEST_STRUCT
        {
            public bool b_Attribut1;
            public bool b_Attribut2;
            public short s_Attribut1;
            public int i_Attribut1;
        }
    Ensuite mon Main où j'ai fait les 2 tests, à savoir caster en dur (ça marche...) et caster dynamiquement avec le PtrToStruct et le GetType() (mais là j'ai l'impression d'avoir un problème d'alignement ou de création de structure...)
    Regardez le résultat sur la console en bas du post pour comprendre le souci...

    Main.cs :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
                unsafe
                {
                    //  Déclaration et initialisation d'une structure
                    TEST_STRUCT TestStruct;
                    TestStruct.b_Attribut1 = true;
                    TestStruct.b_Attribut2 = false;
                    TestStruct.s_Attribut1 = 1;
                    TestStruct.i_Attribut1 = 2;
     
                    //  Déclaration d'un pointeur sur cette structure
     
                    TEST_STRUCT* pTestStruct = &TestStruct;
     
     
                    //  CAST EN DUR
                    TEST_STRUCT* pCastEnDur = (TEST_STRUCT*)pTestStruct;
     
                    //  Récupération du type (que je connais je sais... c'est pour comparer aux test suivant...
                    System.Type type = pCastEnDur->GetType();
                    FieldInfo[] fields = type.GetFields();
     
                    Console.WriteLine("----------CAST EN DUR------"); 
                    Console.WriteLine("Size : " + sizeof(TEST_STRUCT));
     
                    Console.WriteLine();
     
                    //  Affichage des infos en utilisant le type obtenu...
                    for (int i = 0; i < fields.Length; i++)
                    {
                        Console.WriteLine("{0,10}\t:\t{1,20}\t:\t{2,5}", fields[i].Name, fields[i].FieldType.FullName, fields[i].GetValue(TestStruct));
                    }
     
                    Console.WriteLine();
     
                    //  Et affichage directement par la structure
                    Console.WriteLine("{0,10}\t:\t{1,20}\t:\t{2,5}", "b_Attribut1", pCastEnDur->b_Attribut1.GetType().FullName, pCastEnDur->b_Attribut1);
                    Console.WriteLine("{0,10}\t:\t{1,20}\t:\t{2,5}", "b_Attribut2", pCastEnDur->b_Attribut2.GetType().FullName, pCastEnDur->b_Attribut2);
                    Console.WriteLine("{0,10}\t:\t{1,20}\t:\t{2,5}", "s_Attribut1", pCastEnDur->s_Attribut1.GetType().FullName, pCastEnDur->s_Attribut1);
                    Console.WriteLine("{0,10}\t:\t{1,20}\t:\t{2,5}", "i_Attribut1", pCastEnDur->i_Attribut1.GetType().FullName, pCastEnDur->i_Attribut1);
     
                    Console.WriteLine("----------"); 
                    //  FIN CAST EN DUR
     
                    Console.WriteLine();
     
                    Console.WriteLine("----------CAST GENERIQUE------"); 
     
                    //  CAST GENERIQUE
                    //  Déclaration d'un IntPtr
                    IntPtr pPointeur = new IntPtr();
     
                    //  On copie l'adresse de TestStruct vers cet IntPtr
                    pPointeur = (IntPtr) pTestStruct;
     
                    System.Reflection.Assembly package = Assembly.GetExecutingAssembly();
     
                    //  On boucle sur toutes les structures de l'Assembly
                    foreach (System.Type _type in package.GetTypes())
                    {
                        //  On a trouvé la bonne structure !!! Elle est écrit en dur mais on peut imaginer facilement l'écrire via une String -> générique donc...
                        if (_type.Name == "TEST_STRUCT")
                        {
                            _type.GetFields();
     
                            object oTestStruct = Marshal.PtrToStructure(pPointeur, typeof(TEST_STRUCT));
     
                            Console.WriteLine("Size : " + Marshal.SizeOf(oTestStruct));
                            Console.WriteLine();
     
                            for (int i = 0; i < fields.Length; i++)
                            {
                                Console.WriteLine("{0,10}\t:\t{1,20}\t:\t{2,5}", fields[i].Name, fields[i].FieldType.FullName, fields[i].GetValue(oTestStruct));
                            }
                        }
                    }
                    //  FIN CAST GENERIQUE
                }
    Et voici l'affichage en console :
    ----------CAST EN DUR------
    Size : 8

    b_Attribut1 : System.Boolean : True
    b_Attribut2 : System.Boolean : False
    s_Attribut1 : System.Int16 : 1
    i_Attribut1 : System.Int32 : 2

    b_Attribut1 : System.Boolean : True
    b_Attribut2 : System.Boolean : False
    s_Attribut1 : System.Int16 : 1
    i_Attribut1 : System.Int32 : 2
    ----------

    ----------CAST GENERIQUE------
    Size : 16

    b_Attribut1 : System.Boolean : True
    b_Attribut2 : System.Boolean : True
    s_Attribut1 : System.Int16 : -7288
    i_Attribut1 : System.Int32 : 19653356


    La question est : le compilo arrive bien à caster en dur alors pourquoi n'y arriverais je pas de l'autre façon ?

    Merci beaucoup les gars.

    Pascal

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut Pcayrol,

    le probleme dans ta demarche, c'est que ton intptr est un pointeur managé et que tu l'utilises avec ptrToStructure qui attend un pointeur vers du unamanaged, donc ca fait n'importe quoi. De meme, la premiere solution marche car c'est du "all-managed" donc aucun probleme.

    Pour reprendre juste le Marshal, ceci devrait marcher :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct TEST_STRUCT
        {
            public bool b_Attribut1;
            public bool b_Attribut2;
            public short s_Attribut1;
            public int i_Attribut1;
        }
     
        class Program
        {
            static void Main(string[] args)
            {
                unsafe
                {
                    //  Déclaration et initialisation d'une structure
                    TEST_STRUCT TestStruct;
                    TestStruct.b_Attribut1 = true;
                    TestStruct.b_Attribut2 = false;
                    TestStruct.s_Attribut1 = short.MaxValue;
                    TestStruct.i_Attribut1 = int.MaxValue;
     
                    //  Allocation de memoire unman
                    IntPtr intptr = Marshal.AllocHGlobal(sizeof(TEST_STRUCT));
     
                    //  Je fabrique un pointeur (normalement ce pointeur sera un retour d'unamanaged)
                    Marshal.StructureToPtr(TestStruct, intptr, false);
                    System.Type type = typeof(TEST_STRUCT);
                    FieldInfo[] fields = type.GetFields();
     
                    object oTestStruct = Marshal.PtrToStructure(intptr, typeof(TEST_STRUCT));
     
                    Console.WriteLine("Size : " + Marshal.SizeOf(oTestStruct));
                    Console.WriteLine();
     
                    for (int i = 0; i < fields.Length; i++)
                    {
                        Console.WriteLine("{0,10}\t:\t{1,20}\t:\t{2,5}", fields[i].Name, fields[i].FieldType.FullName, fields[i].GetValue(oTestStruct));
                    }
                    //  FIN CAST GENERIQUE
                }
     
            }
        }

    Mais à la limite, c'est pas vraiment important puisque apparement ton appli recuperera de base un pointeur non managé et dans ce cas ton ptrtostruct marchera directement. Ici dans l'exemple le probleme venait du fait que tu essayé de reproduire une transition unamanaged/managé dans un contexte uniquemement managé. En esperant que cela t'aide, bon courage. =)

    Nota : Loué soit celui qui à eu l'idée de virer les pointeurs de C# !

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Par défaut Merci SirJulio
    Merci !

    Effectivement, j'avais un bug dans mon programme de test...

    Il me reste un petite bizarrerie que vous allez éclaircir j'espère...

    J'arrive maintenant à faire ce que je veux : à savoir afficher la valeur des attributs d'un pointeur sur un zone mémoire en la castant "génériquement" car je connais le nom de la structure sous la forme d'un String...

    Le problème c'est qu'il y'a une différence entre les 2 méthodes suivantes :
    La méthode 1 marche... tandis que la méthode 2 affiche n'importe quoi.
    Il y'a en effet un problème d'alignement j'ai l'impression Cf. le bas du POST

    Méthode 1 : le Cast en dur que je ne veux pas faire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                                DOORS_OUTPUTS_STRUCT* pCastEnDur = (DOORS_OUTPUTS_STRUCT*) intptr;
    Méthode 2 : mon Cast générique
    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
     
     
                              System.Reflection.Assembly package = Assembly.GetExecutingAssembly();
     
                              //  On boucle sur toutes les structures de l'Assembly
                              foreach (System.Type _type in package.GetTypes())
                             {
     
                                 String structureOUT = "DOORS_OUTPUTS_STRUCT";
     
                                //  On a trouvé la bonne structure !!! Elle est écrit en dur mais on peut imaginer facilement l'écrire via une String -> générique donc...
                                if (_type.Name == structureOUT)
                                {
                                    object oTestStruct = Marshal.PtrToStructure(intptr, _type);
     
                                    FieldInfo[] fields = _type.GetFields();
     
                                    for (int i = 0; i < fields.Length; i++)
                                    {
                                        Console.WriteLine("{0,50}\t:\t{1,20}\t:\t{2,5}", fields[i].Name, fields[i].FieldType.FullName, fields[i].GetValue(oTestStruct));
                                    }
                                }
                            }
    Struct.h : d'où vient mon pointeur intptr non managé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct _DOORS_OUTPUTS_STRUCT
    {
        BOOLEAN   DOORS_DOORS_WARNING_LIGHT_ON_GROUND;
        BOOLEAN   DOORS_SERVICE_DOORS_WARNING_LIGHT_ON_GROUND;
    }
    Struct.cs dans mon code managé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct DOORS_OUTPUTS_STRUCT
    {
        public bool DOORS_DOORS_WARNING_LIGHT_ON_GROUND;
        public bool DOORS_SERVICE_DOORS_WARNING_LIGHT_ON_GROUND;
    }
    Pour que le code de la méthode 2 fontcionne il me faut ajouter du padding dans le Struct.h comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct _DOORS_OUTPUTS_STRUCT
    {
        BOOLEAN   DOORS_DOORS_WARNING_LIGHT_ON_GROUND;
        BOOLEAN   PAD0[3];
        BOOLEAN   DOORS_SERVICE_DOORS_WARNING_LIGHT_ON_GROUND;
        BOOLEAN   PAD1[3];
    }
    et je ne veux pas modifier cette structure...



    Conclusion : ce qui est quand même bizarre vous me l'accorderez c'est que le cast
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DOORS_OUTPUTS_STRUCT* pCastEnDur = (DOORS_OUTPUTS_STRUCT*) intptr;
    n'a pas besoin de cet ajout de padding pourquoi ?

    Merci de votre aide...

    Pascal

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Tu as essayé de bidouiller le Pack de ton StructLayout (ou meme ne pas le specifier), me semble que par defaut, le pack est à 8.

    A part ca, j'avoue que je ne comprends pas trop ... =(

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

Discussions similaires

  1. Problème de cast générique (T)
    Par stailer dans le forum C#
    Réponses: 9
    Dernier message: 19/12/2013, 16h43
  2. Problème de casting avec des génériques
    Par bountykiler dans le forum C++/CLI
    Réponses: 2
    Dernier message: 05/07/2012, 13h00
  3. [C#] Problème de Cast sur un type générique
    Par Bobbledople dans le forum C#
    Réponses: 2
    Dernier message: 10/06/2009, 11h04
  4. Problème de cast/serialization/externalization ?
    Par Linlin dans le forum CORBA
    Réponses: 1
    Dernier message: 06/12/2004, 16h46
  5. [C#] Problème de casting de @IDENTITY
    Par bilb0t dans le forum Accès aux données
    Réponses: 7
    Dernier message: 03/09/2004, 09h42

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