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;
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
Livres en rapport
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|