Problème d'appel de fonction d'une DLL en C

cs_richard22 Messages postés 2 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 22 juillet 2005 - 22 juil. 2005 à 11:24
bathof Messages postés 28 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 31 janvier 2009 - 25 juil. 2005 à 18:58
Bonjour



Voici mon problème:

je réalise une DLL avec cette fonction:



DLLIMPORT int Algo(int **result)

{ etc... }



et dans un fichier .h :



#ifndef _DLL_H_

#define _DLL_H_



#if BUILDING_DLL

# define DLLIMPORT __declspec (dllexport)

#else /* Not BUILDING_DLL */

# define DLLIMPORT __declspec (dllimport)

#endif /* Not BUILDING_DLL */





DLLIMPORT int Algo(int **result);



#endif /* _DLL_H_ */



Jusque là tout vas bien.

Puis lors de la réutilisation de cette fonction dans un autre programme
C il m'est impossible d'envoyer un tableau à deux dimensions dans la
DLL.



Voici les initialisations que je réalise:



typedef int (WINAPI *DLL_Function)(int *_Value);



puis dans le main:



Dll_Algo= (DLL_Function)GetProcAddress(hDLL,"Algo");

...

detection=Dll_Algo(MatriceInt); /* erreur ici */



avec MatriceInt[4][21]



et mon erreur est celle-ci :232 : cannot convert `int (*)[21]' to `int*' in argument passing

Je cherche donc a faire passer mon tableau dans la DLL pour y faire un
algorithme précis mais je bloque sur l'envoie de ce tableau...



Mon environnement de déveloipppement est DEV C++



Merci d'avance pour votre attention et vos réponses

5 réponses

ricky78 Messages postés 126 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 11 juillet 2006
22 juil. 2005 à 11:56
essaye cela

detection=Dll_Algo(&MatriceInt);

TOCHE
0
cs_richard22 Messages postés 2 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 22 juillet 2005
22 juil. 2005 à 12:03
non ça fonctionne pas :(
erreur:
cannot convert `int (*)[4][21]' to `int*' in argument passing
0
ricky78 Messages postés 126 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 11 juillet 2006
22 juil. 2005 à 12:24
re
Ce tuto explique les pointeurs pout des tableaux a une dimension, il doit surement etre transposable pour des tableau a 2D
http://chgi.developpez.com/pointeur/

En general a 1D

int Algo(int *result);

*result = 10;

appel de la fonction : algo(&result)

en 2D je ne sais pas sinon passe ta matrice en une dimension dans l'echange entre fonction puis remet la en 2D si tu veux dans ta fonction
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 2
22 juil. 2005 à 13:32
typedef int (WINAPI *DLL_Function)(int *_Value);

Ta fonction attend un tableau a 2 dimensions, pourquoi le prototype ne comprend qu'une seule dimension ?!

typedef int (WINAPI *DLL_Function)(int **_Value);

Et que vient faire ce WINAPI ? Je vois que tu ne definis pas cette convention d'appel dans la DLL (WINAPI == __stdcall), donc soit tu l'enleves du prototype, soit tu le mets dans la DLL.

+2(p - n)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bathof Messages postés 28 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 31 janvier 2009
25 juil. 2005 à 18:58
J'ai deux solutions à ton problème :



La première solution : si tu programmes en c++ tu peux créer
un tableau dynamique à deux dimentions avec new et delete ou si tu
programmes en c avec malloc et free, solution recommandée.

Attention : sizeof sur un pointeur renvoie la taille du pointeur et non pas la taille du tableau.



Exemple avec new et delete (c++) :



// Création de ton tableau dynamique à deux dimentions

// Dans cette exemple le tableau sera " Tab [2][4] "

int** Tab = NULL;

int NbrCol = 4;

int NbrLig = 2;



Tab = new int* [NbrLig];



for(int I=0; I<NbrLig; I++ )

Tab[I] = new int [NbrCol];





// Tu le passes en paramètre de ta fonction

Algo(Tab);



// Et quand tu en as plus besoin tu le detruis (IMPORTANT, sinon la ram sature )

/* Attention une fois détruit tous les pointeurs qui pointent vers cette zone mémoire

ne seront plus utilisables, valeur incorrect */

for(int I=0; I<NbrLig; I++)

delete [] Tab[I];

delete [] Tab;

Tab = NULL;





La deuxieme solution : Il faut modifier ta fonction comme cela, cette solution n'est pas la bonne mais elle fonctionne.



DLLIMPORT int Algo(int* tempresult, int SizeLigne)

{

#define result(X,Y,Z) tempresult[ (X*Z)+Y ]

int NbrCol = (SizeLigne/sizeof(int));



// Afficher une partie du tableau result[0][0]

printf("%d", result(0,0,NbrCol) );



// Modifier une partie du tableau result[0][0] = 2

result(0,0,NbrCol) = 2;



#undef result

}





// et dans ton programme

int Tab[2][4];



Algo( (int*)*Tab, sizeof(Tab[0]) );



voila j'éspère que cela ta aidé, bonne chance et a +
0
Rejoignez-nous