Accueil > Forum > > > > Passer un pointeur sur tableau de structure
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
|
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
|
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.
|
|
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;
Passer une structure à une DLL en C [ par dark_naruto25 ]
Salut à tous ! Voilà mon souci, pour le boulot je dispose d'un DLL (conçu en C) que je dois initialisé depuis mon code C#. Ma structure ressemble à q
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
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|