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

Windows Forms Discussion :

problème de type dans une union [c#]


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 102
    Par défaut problème de type dans une union [c#]
    Bonjour à tous,

    j'ai voulu utiliser une structure sous la forme d'une union, mais il ne semble pas possible d'y mettre des objets (tels que string par exemple)

    or je dois y faire figurer une chaine de caractères, mais je n'arrive pas à utiliser de char[5] (par exemple), pour remplacer l'utilisation de string!

    quelqu'un sait comment il est possible de mettre un type string dans une struct où l'offset mémoire est géré pour fonctionner comme une union?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Ca existe les union en C# ?

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 102
    Par défaut
    En utilisant une structure et en gérant l'offset mémoire, on créer une union...

    il faut inclure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Runtime.InteropServices;
    et l'union se déclare comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [StructLayout(LayoutKind.Explicit)]
    public struct Var_IorF
    {    
        [FieldOffset(0)] public int i;
        [FieldOffset(0)] public float f;
    }

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=5)]
    public string str;

    pour une chaîne de 5 caractères ...

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 102
    Par défaut
    ça ne passe pas non plus... ça plante dés le chargement et sur VS en mode débogage, il me signale qu'avec un objet, sa taille mémoire n'étant pas prévisible, il doit se chevaucher.

    je pense que je vais passer outre l'union, mais bon ce sera moins propre..

    merci quand même..

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Un type valeur et un type référence ne peuvent pas se chevaucher en code managé.
    Il faut donc créer deux structures, une en LayoutKind.Explicit (avec les types valeurs) et l'autre en LayoutKind.Sequential (avec le type référence).

    ms-help://MS.NETFramework.v20.fr/dv_fxinterop/html/0068fbf2-3ab4-4f43-abd8-4d34ae17bd7c.htm

  7. #7
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Citation Envoyé par maxdwarf Voir le message
    je pense que je vais passer outre l'union, mais bon ce sera moins propre..
    Ca depend ce qu'on appelle propreté.
    Je croyais que ce genre de chose avait pas de sens depuis que les ordinateurs ont plus de 64k de memoire vive.

    Que fais-tu comme programme pour avoir besoin d'une telle chose? Et surtout pourquoi le fais-tu en .Net?

  8. #8
    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 _skip Voir le message
    Ca depend ce qu'on appelle propreté.
    Je croyais pas que ce genre de chose avait pas de sens depuis que les ordinateurs ont plus de 64k de memoire vive.

    Que fais-tu comme programme pour avoir besoin d'une telle chose? Et surtout pourquoi le fais-tu en .Net?
    Je plussoie !

    le fait de passer le tout en sequential (par defaut) au lieu de l'explicit te simplifiera enormement la tache.

    J'avais trouvé aussi la solution des Fixed buffer, mais apparement il y a un "conflit" quand on utilise un buffer sur une structure explicit (le code generé produit un champs sans en declarer l'offset ...). Bref tu peux regarder de ce coté la aussi.

    Bon courage.

  9. #9
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    juste en passant

    Le fait qu'il n'y ait pas d'union en C# est assez logique

    Au final, c'est quoi une union ?

    Dire qu'un espace mémoire est "attaquable" de façon différente c'est à dire
    que X octets peuvent etre vus suivant le contexte comme un entier, ou un short, ou bien une structure

    Dans le cadre de langage type, il est plutot pertinent que cela est disparu

    Par contre, c'est vrai que , notamment dans le monde des echanges reseaux,
    il etait bien pratique de faire une union de struct des trames à passer..

    Mais bon, on arrive à s'en sortir quand méme

    (pour info, une appli C++ qui envoyait des trames union vers une autre appli c++, a été remplacée par une appli C#... (mais toujours avec le meme recepteur en C++), et on a réussi à faire "cohabiter" en décodant à la main les trames "union" coté C# en utilisant un memoryStream et des readbyte ou readInt suivant le contexte (mais ptain, c'était gavant de faire cela)

    The Monz, Toulouse

Discussions similaires

  1. Probléme de jointure dans une requete avec UNION
    Par MissOleana dans le forum Requêtes
    Réponses: 1
    Dernier message: 28/11/2013, 16h45
  2. Probléme de rand dans une requete union
    Par m4riachi dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/05/2011, 17h16
  3. Réponses: 4
    Dernier message: 28/04/2008, 18h50
  4. Réponses: 3
    Dernier message: 23/05/2006, 16h09
  5. Problème de Type dans une table liée
    Par tangueros78 dans le forum Access
    Réponses: 19
    Dernier message: 16/03/2006, 10h14

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