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 :

utiliser fonction retournant un pointeur d'un tableau de structure


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 64
    Par défaut utiliser fonction retournant un pointeur d'un tableau de structure
    Bonjour,

    J'utilise une dll qui avec une fonction qui renvoie un pointeur sur un tableau de structure complexe (utilisant des float, int, ...)
    Pour résumer voici un exemple de ce que je veux faire
    En C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct
    { 
    	uint8 telfixe; 
    	float telPort; 
    } MASTRUCTURETEL;
     
    MASTRUCTURETEL DLL_EXPORT * GetTabStructure() 
    { 
    	TabmaStruct[1].telfixe = 128;
    	TabmaStruct[1].telPort = -666.66; 
    	return &maStruct;
    }
    Coté C# :
    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
     [StructLayout(LayoutKind.Sequential)]
        public class MaStructTelCSharp
        {
            public byte telFixe;
            public float telMobile;
        }
     
     
     
    [DllImport("SbgDriver.dll")]
            public static extern IntPtr GetTabStructure();
     
     
     
    MaStructTelCSharp[] maStructureCSharp = new MaStructTelCSharp[2];
    IntPtr tabUnmanaged = Marshal.AllocHGlobal(Marshal.SizeOf(maStructureCSharp[1]) * 2);
    tabUnmanaged = GetTabStructure();
    Marshal.PtrToStructure(tabUnmanaged, maStructureCSharp);
    Quand je lance le code j'ai cette erreur:
    La structure spécifiée doit être blittable ou avoir des informations de disposition. Nom du paramètre : structure

    Je souhaite réussir mon exemple simple avant de m'attaquer à mon driver qui renvoie une structure beaucoup plus complexe. (de plus je n'ai pas accès au code de la dll finale).
    Pourriez vous m'aider?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 99
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    IntPtr tabUnmanaged = GetTabStructure();
     
    MaStructTelCSharp[] maStructureCSharp = new MaStructTelCSharp[2];
    for (int i = 0; i < maStructureCSharp.Length; i++)
    {
        MaStructTelCSharp a = new MaStructTelCSharp();
        maStructureCSharp[i] = a; 
     
        IntPtr ptrStruct = new IntPtr(Marshal.SizeOf(a) * i + tabUnmanaged.ToInt32());
        Marshal.PtrToStructure(ptrStruct, a);
    }
    OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    [StructLayout(LayoutKind.Sequential)]
    public class Result
    {
        MaStructTelCSharp a;
        MaStructTelCSharp b;
    }
     
    ...
    Result result = new Result();
    Marshal.PtrToStructure(tabUnmanaged, result);

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 64
    Par défaut
    Merci beaucoup pour ta réponse.
    Je vais utiliser ton première exemple car mon tableau final devrait utiliser 768 variable, donc la boucle for est plus judicieuse.

    Ça compile et je n'ai pas d'erreur à l'exécution. En revanche ma structure reste désespérément vide! Or dans la dll le tableau est bien remplie.
    Aurais tu une idée?
    Par avance merci.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 99
    Par défaut
    - Je viens de faire un test ça fonctionne
    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
     
    extern "C"
    {
         MASTRUCTURETEL TabmaStruct[2];
     
         DEL_DEVDMO_API MASTRUCTURETEL* __stdcall GetTabStructure()
         { 
    	     TabmaStruct[0].telfixe = 1;
    	     TabmaStruct[0].telPort = 2.5f; 
     
             TabmaStruct[1].telfixe = 3;
    	     TabmaStruct[1].telPort = 3.5f; 
     
              return TabmaStruct;
         }
    }
    Au hasard :
    - Tu renvoies un ptr sur la pile ?
    - Dans le code que tu as fourni (est incorrect), tu remplis un tableau mais tu retournes un autre ptr.

    Si j'ajoute un n° de tel comment sauras tu que le tableau contient maintenant 768 elements ? Je ne connais pas ton projet, je ne sais pas si ton approche est bonne.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 64
    Par défaut
    Houps, j'ai fait un mauvais copier coller, effectivement ca fonctionne!!
    Merci beaucoup.

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

Discussions similaires

  1. [POO]fonctions retournant un pointeur initialisé
    Par Invité dans le forum Débuter
    Réponses: 1
    Dernier message: 09/02/2011, 13h31
  2. Réponses: 4
    Dernier message: 23/06/2009, 16h52
  3. Réponses: 6
    Dernier message: 04/03/2009, 19h50
  4. Fonction retournant un pointeur
    Par Le Furet dans le forum C
    Réponses: 8
    Dernier message: 25/09/2005, 18h54
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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