Definition pointeur [Résolu]

survcopt 221 Messages postés mardi 27 mai 2003Date d'inscription 12 juillet 2012 Dernière intervention - 4 juin 2007 à 16:42 - Dernière réponse : survcopt 221 Messages postés mardi 27 mai 2003Date d'inscription 12 juillet 2012 Dernière intervention
- 4 juin 2007 à 19:10
Bonjour j'ai une structure de type
public struct GM_Rectangle_t
    {
        public double MinX;
        public double MinY;
        public double MaxX;
        public double MaxY;
    };

Et je voudrais declarer un un pointeur sur cette structure car j'ai toujours ma Super dll en C qui me réclame  comme paramètre :
const GM_Rectangle_t* aWorldBounds,

donc apres avoir rempli ma structure
GM_Rectangle_t WorldBounds;
WorldBounds.MinX = 1;
WorldBounds.MaxX  = 2;
WorldBounds.MinY  = 1;
WorldBounds.MaxY  = 2;
Est ce que la fonction
                IntPtr WorldBoundsPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(WorldBounds));

Me déclare correctement mon pointeur ?
Comment puis-je verifier le contenu de ce que pointe mon pointeur ?

www.survey-copter.com
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 juin 2007 à 18:32
3
Merci
oups j'ai oublié des parenthèses :

// passage par adresse mais les structs doivent être déclarées sur la pile,
// c-à-d dans la fonction et pas en champs de la classe par exemple.
unsafe
{
    GM_ConvertCoordPixelToGround( 1, 1, out x, out y, ( IntPtr )( &worldBounds ), ( IntPtr )( &pixelRect ) );
}

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 70 internautes ce mois-ci

Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 juin 2007 à 17:11
0
Merci
Salut, là ton pointeur il ne contient rien du tout, tu as seulement alloué un bloc de mémoire non managée égale à la taille de ta structure, maintenant faudrait la remplir avec StructureToPtr comme je t'ai montré >ici< mais tu te compliques la vie, pour passer une structure comme un pointeur suffit d'utiliser le mot clé 'ref' et c'est le runtime qui va s'occuper tout seul du marshaling.

unsafe
{
   GM_Rectangle_t* p = ( GM_Rectangle_t* )worldBoundsPtr;
   double minX = p->MinX;
   // etc ...
}
Commenter la réponse de Lutinore
survcopt 221 Messages postés mardi 27 mai 2003Date d'inscription 12 juillet 2012 Dernière intervention - 4 juin 2007 à 17:23
0
Merci
Merci à toi mais la ca ne marche pas ...
Et je commence à tourner en rond avec cette dll
La déclaration dans le .h est
GM_Error_t32 GM_ConvertCoordPixelToGround
(
sint32 aPixelX, // IN: X Coord in pixel space
sint32 aPixelY, // IN: Y Coord in pixel space
double* aGroundX, // OUT: X Coord in current projection
double* aGroundY, // OUT: Y Coord in current projection
const GM_Rectangle_t* aWorldBounds, // IN: World bounds to convert from or NULL for last drawn
const GM_PixelRect_t* aPixelRect // IN: Pixel bounds to convert from or NULL for last drawn
);

je la déclare
[
DllImport(DLLFileName, EntryPoint =
"GM_ConvertCoordPixelToGround")]

public
static
extern
GM_Error_t32 GM_ConvertCoordPixelToGround(
Int32 aPixelX,
Int32 aPixelY,
out
double aGroundX,
out
double aGroundY,
ref
GM_Rectangle_t aWorldBounds,
ref
GM_Rectangle_t aPixelRect);

j'ai utilisé le mot ref pour passer ma structure par pointeur et je l'appelle ainsi
LastGMError =
GlobalMapperDLL.GM_ConvertCoordPixelToGround(e.X, e.Y,
out XGround,
out YGround,
ref WorldBounds,
ref PixelRect);
 
Et la dll me renvoi via LastGMError
comme quoi les paramètres ne sont pas bon.
Je pense que la procedure est bonne, si pour toi c'est Ok j'irai voir du côté de mes paramètres.
Merci

www.survey-copter.com
Commenter la réponse de survcopt
survcopt 221 Messages postés mardi 27 mai 2003Date d'inscription 12 juillet 2012 Dernière intervention - 4 juin 2007 à 17:25
0
Merci
la déclaration du .h est
GM_Error_t32 GM_ConvertCoordPixelToGround
(sint32 aPixelX,sint32 aPixelY,double* aGroundX,double* aGroundY,const GM_Rectangle_t* aWorldBounds,const GM_PixelRect_t*);
Merci
www.survey-copter.com
Commenter la réponse de survcopt
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 juin 2007 à 17:47
0
Merci
Essaye de passer des structures NULL c-à-d IntPtr.Zero pour voir si tu as toujours une erreur.
Commenter la réponse de Lutinore
survcopt 221 Messages postés mardi 27 mai 2003Date d'inscription 12 juillet 2012 Dernière intervention - 4 juin 2007 à 18:00
0
Merci
Pour passer un pointeur nul il faut changer la déclaration

public
static
extern
GM_Error_t32 GM_ConvertCoordPixelToGround(
Int32 aPixelX,
Int32 aPixelY,
out
double aGroundX,
out
double aGroundY,
IntPtr aWorldBounds,
IntPtr aPixelRect);
et ensuite lancer
IntPtr

WorldBoundsPtr =
new
IntPtr(0);

IntPtr PixelRectPtr =
new
IntPtr(0);

LastGMError =
GlobalMapperDLL.GM_ConvertCoordGroundToPixel(XGround, YGround,
out X,
out Y ,
ref WorldBounds,
ref PixelRect);
Comme ca il n'y a plus de probleme ca marche

www.survey-copter.com
Commenter la réponse de survcopt
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 juin 2007 à 18:31
0
Merci
Il faut changer la déclaration comme tu l'as fait.. et même si ça change rien, IntPtr.Zero c'est mieux que new IntPtr( 0 ).

// passage par adresse mais les structs doivent être déclarées sur la pile,
// c-à-d dans la fonction et pas en champs de la classe par exemple.
unsafe
{
    GM_ConvertCoordPixelToGround( 1, 1, out x, out y, ( IntPtr )&worldBounds, ( IntPtr )&pixelRect );
}
Commenter la réponse de Lutinore
survcopt 221 Messages postés mardi 27 mai 2003Date d'inscription 12 juillet 2012 Dernière intervention - 4 juin 2007 à 18:35
0
Merci
J'ai cette erreur qui pointe sur le &

Erreur 1 Les pointeurs et les mémoires tampons de taille fixe ne peuvent être utilisés que dans un contexte unsafe

Merci
www.survey-copter.com
Commenter la réponse de survcopt
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 juin 2007 à 18:41
0
Merci
Clique droit sur ton projet puis dans l'onglet Generer tu coches Autoriser le code unsafe.
Commenter la réponse de Lutinore
survcopt 221 Messages postés mardi 27 mai 2003Date d'inscription 12 juillet 2012 Dernière intervention - 4 juin 2007 à 18:46
0
Merci
Pareil
Propriete-> generer-> Autoriser le code unsafe
ca ne change rien

www.survey-copter.com
Commenter la réponse de survcopt
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 juin 2007 à 19:02
0
Merci
As tu bien mis le code dans un bloc unsafecomme dans mon exemple !??
Commenter la réponse de Lutinore
survcopt 221 Messages postés mardi 27 mai 2003Date d'inscription 12 juillet 2012 Dernière intervention - 4 juin 2007 à 19:10
0
Merci
désolé j'avais pas vu le bloc
Merci beaucoup

www.survey-copter.com
Commenter la réponse de survcopt

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.