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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    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.

+ 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