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

Signaler
Messages postés
2
Date d'inscription
mercredi 15 juin 2005
Statut
Membre
Dernière intervention
22 juillet 2005
-
Messages postés
28
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
31 janvier 2009
-
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

Messages postés
126
Date d'inscription
jeudi 5 juin 2003
Statut
Membre
Dernière intervention
11 juillet 2006

essaye cela

detection=Dll_Algo(&MatriceInt);

TOCHE
Messages postés
2
Date d'inscription
mercredi 15 juin 2005
Statut
Membre
Dernière intervention
22 juillet 2005

non ça fonctionne pas :(
erreur:
cannot convert `int (*)[4][21]' to `int*' in argument passing
Messages postés
126
Date d'inscription
jeudi 5 juin 2003
Statut
Membre
Dernière intervention
11 juillet 2006

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
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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)
Messages postés
28
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
31 janvier 2009

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 +