begin process at 2010 02 10 06:46:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Système

 > 

Mémoire

 > 

Passer un pointeur sur tableau de structure


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Passer un pointeur sur tableau de structure

dimanche 10 février 2008 à 23:00:36 | Passer un pointeur sur tableau de structure

olibara

Bonjour

Depuis C# j'aimerais appeller une Dll ecrite en C

J'ai plusieurs fonctions dont certaines utilisent un pointeur sur tableau de structure, comment dois-je déclarer ces structure et en C# et declarer la fonction 

Est ce que ceci est bon ?

    public struct PntF
    {
      public double X;
      public double Y;
    };

    [DllImport("bcta.Dll")]
    static extern int bctaOpen(IntPtr handle, string a, int b);
    [DllImport("bcta.Dll")]
    static extern int bctaGetTrack(IntPtr hBcta, ref PntF Pnt, int count);

   PntF []Pnt;

Est-il possible de definir un tableau de longueur fixée ?

 

dimanche 10 février 2008 à 23:57:57 | Re : Passer un pointeur sur tableau de structure

Lutinore

Administrateur CodeS-SourceS
Réponse acceptée !

Salut, le marshalling par défaut vers le code unsafe va fixer ton tableau en mémoire si le prototype managé de la fonction prend un tableau en paramètre mais pour les types non blittables ça peut être couteux en terme de performance. Il est possible de fixer un tableau en mémoire pour le protéger du GC avec l'instruction fixed ou la structure GCHandle.


[ StructLayout( LayoutKind.Sequential ) ]
private struct MyStruct
{
    public unsafe fixed int MyArray[ 4 ]; // tableau inline.
}

private static unsafe void Main( string[ ] args )
{
    MyStruct[ ] tab = new MyStruct[ 4 ]; // tableau sur le tas managé.

    fixed( MyStruct* p = tab )
    {
        // Ici le tableau est fixé et ne sera pas déplacé par le GC.
    }
}

lundi 11 février 2008 à 08:08:07 | Re : Passer un pointeur sur tableau de structure

olibara

Merci,

Je vais essayer de digerer ca et le mettre en pratique

a suivre ...
lundi 11 février 2008 à 08:53:53 | Re : Passer un pointeur sur tableau de structure

olibara

Bonjour encore

J'ai hesité a ouvrir un nouveau sujet, mais la question reste liée a l'utilisation de pointeur et l'appel de dll


   [DllImport("bcta.Dll")]
    static extern int bctaOpen(IntPtr handle, string a, int b);

bctaOpen voit handle comme void ** et l'alloue (calloc en C)

Comment dois-je prototyper ma fonction en C# et declarer handle ?
Tel que je l'ai fait je me fais jeter et je peux comprendre car Handle est un pointeur et non un pointeur de pointeur ??

Merci de l'aide précieuse
lundi 11 février 2008 à 08:59:42 | Re : Passer un pointeur sur tableau de structure

olibara

Merci

Je vais me répondre a moi meme comme ca je peux aider les autres

Je devais faire :

  [DllImport("bcta.Dll")]
    static extern int bctaOpen(ref IntPtr handle, string a, int b);

ensuite

IntPtr handle = (IntPtr) 0;
string path;
int count;
bctaOpen(ref IntPtr handle, path , count);
lundi 11 février 2008 à 09:23:26 | Re : Passer un pointeur sur tableau de structure

olibara

Bonjour

Je suis con ou mal réveillé mais j'ai encore rien compris
Pas toujours évident le C# quand on est imprégné d'habitudes en C

Toujours mon probleme de declarer et assigner un tableau de structure

1- Je declare une fonction de ma dll qui utilise un tableau de structures PntF dont le count est donné (count)
    [DllImport("bcta.Dll")]
    static extern int bctaGetTrack(IntPtr hBcta, ref PntF Pnt, int count);

2- Je declare la structure
   public struct PntF
    {
      public double X;
      public double Y;
    };

3- Je declare le tableau
   PntF []Pnt;

4- ICI je suis perdu Comment dois je allouer ce tableau qui n'a toujours pas de dimension ??
En C j'aurais fait Pnt[2]; ou un calloc

lundi 11 février 2008 à 13:35:16 | Re : Passer un pointeur sur tableau de structure

Lutinore

Administrateur CodeS-SourceS
ref IntPtr pour le double pointeur, c'est bon, tu as trouvé tout seul.

..

3 ) Déclaration du tableau.

PntF[ ] pnt;

4 ) Allocation sur le tas managé. ( ou Marshal.AllocHGlobal pour alloué de l'espace sur le tas non-managé comme en C ).

pnt = new PnF[ 10 ]; // allocation de sizeof( PnF ) * 10

5 ) En C# il y a un garbage collector qui déplace les objets en mémoire, donc il faut fixer le tableau en mémoire avant de le passer à la dll, avec l'instruction fixed ou avec un GCHandle.. Si ton prototype managé, (celui avec dllimport ) prend un tableau en argument à la place d'un pointeur ou d'un ref, dans ce cas le marshaling par défaut va fixer le tableau le temps de l'appel de la fonction. ( c'est ce que j'ai déja écris dans le 1er message ^^ )
lundi 11 février 2008 à 14:29:27 | Re : Passer un pointeur sur tableau de structure

olibara

Merci

Grace a tes explication et mes nombreux essais intemediares j'ai pu avancer

A propos de GC
J'avais fais un test positif mais SANS fixer le tableau

Ca a marché mais je suppose que le risque existait de voir mon tableau déplacé avannt son exploitation complete par la DLL

(par chance, la DLL recopie ce tableau tout de suite a l'appel pour son usage personnel)
mardi 6 mai 2008 à 11:38:51 | Re : Passer un pointeur sur tableau de structure

marielle1

Je suis content de voir qu'il y'a des gens qui ont galérés sur les dll's et les passages de pointeur....
J'ai compris ce que vous aviez fait mais de mon côté je galère car je dois passer un tableau à 2 dimensions....

 je dois utiliser  cette fonction dans ma dll:
int MSTX_EXPORT S00X_ReadPageC240(BOOL readc240, unsigned char blocknb, unsigned char firstpage, unsigned char nbpages, unsigned char pages[][S00X_ANTICOLL_ARRAY], unsigned char *cmdstatus);

dans mon code en C#, je l'ai déclarée de cette manière:
[DllImport("MedioSTX.dll")]
static extern unsafe int S00X_ReadPageC240(bool readc240, char blocknb, char firstpage, char nbpages, char** pages, char* cmdstatus);

depuis ma fonction je l'appelle de cette façon:
char[][] pages= new char[4][];
for (int i = 0; i < 4; i++)
       pages[i] = new char[8];
char cmdstatus = '0';
fixed( char** pBuffer = pages[0] )
 {
         S00X_ReadPageC240(true, (char)0, (char)0, (char)1, pBuffer, &cmdstatus);
  }


Si quelqu'un pouvait m'expliquer comment je peux passer mon char[][] pages dans la dll pour qu'elle l'initialise.

Merci d'avance pour votre aide...
A+




mardi 6 mai 2008 à 12:03:18 | Re : Passer un pointeur sur tableau de structure

olibara

A mon avis, t'est mal barré !
Qui a écrit ta DLL ?

Comment cette DLL peut elle connaitre la dimension que tu donne à pages ?
en particulier S00X_ANTICOLL_ARRAY ?

Dans ce genre de situation, soit tu cree une fonction d'init de la DLL qui prepare ses buffer et une fonction close qui les libere
Soit tu passe a la DLL toute l'information nécessaire pour pour qu'elle sache ou elle peurt chatouiller la memoire.


Si j'ai bien lu et compris, ni l'un ni l'autre ne sont fait ici.


1 2

Cette discussion est classée dans : int, dll, tableau, structure, pointeur


Répondre à ce message

Sujets en rapport avec ce message

Structure avec tableau [ par bip98 ] Bonjour,Je sais, m'a question peut paraitre simple... mais j'ai vraiment du mal ! pourtant c'est surment quelques choses de très simple..je voudrais c Tableau dans une structure [ par bip98 ] Je n'arrive pas à créer un tableau dans une structure..voilà mon code:public struct struct_motor   {     public string port_dev;     public int v_ind; Array.Sort sur un tableau de structure [ par MAQFAB ] Bonjour à tous et à toutes,J'essaye d'utiliser la fonction Array.Sort d'une manière un peu poussée, et je ne m'en sors pas.Considérons une structure : Passer un tableau de Byte à une DLL [ par hdr ] Salut à tous,Je souhaiterai utiliser une fonction dans une DLL dont le prototype est :    public virtual int GetImageRawData(ref int pBuf, int bufLen) Appel d'une dll avec tableau & structure [ par Morgan_2956 ] Bonjour à tous, Malgré toutes mes recherches et essais, je n'arrive décidément pas à passer des tableaux dans une structure provenant d'une dll. Je do Dll c++ utilisée en C# [ par Florenzau ] Bonjour à tous, Je dois utiliser une Dll réalisée en C++ sur un programme en C#. J'arrive à utiliser des fonctions simples telles que : c++ : void Trier plusieur tableau [ par spmsbl ] Bonjour je dois trier plusieur tableau a partir d'un seul. Exemple j'ai un tableau int , un tableau double et un char, je dois les trier par ordre c Programmation C: Verification d'une permutation [ par joshua509 ] Comment rendre cette fonction fonctionnelle pour un tableau de n'importe quel taille: Voici la fonction: int Permutation(int tab[],int n) { int i=0; Comportement d'un interop C++/C# différent en fonction du framework .NET [ par zibist ] Bonjour, Je travaille actuellement sur un projet pour migrer un programme de VB en .NET et je rencontre un problème qui semble venir de la version du C# et pointeur de pointeur de struct [ par PierreCSharp63 ] bonjour,malgré toutes mes recherches et essais, je n'arrive décidément pas à appeler une fonction C++ depuis le C#. En effet cette fonction alloue un


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales