gmorello
Messages postés9Date d'inscriptionvendredi 22 décembre 2006StatutMembreDernière intervention 6 mars 2008
-
25 sept. 2007 à 17:07
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 2010
-
26 sept. 2007 à 18:34
Bonjour, voici mon problème:
Dans mon code j'ai une fonction importer d'une dll (Je n'ai pas acces au source de cette dll) qui me détraque mes adresses mémoire de variable
Voici mon code :
void LireCarte( Parameters params )
{
//DECLARATION DE VARIABLE
[...]
En rouge la variable en question qui est en fait un pointeur vers une structure.
En Bleu la fonction à l'origine de mes soucis.
Ma question est la suivante existe-t-il un moyen de sauvegarder l'adresse mémoire de params avant exécution de la fonction et de lui réaffecté ensuite.
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 25 sept. 2007 à 17:29
Puisque tu ne passes pas params en argument de ta fonction, je ne vois que deux explications : la fonction appelée est soit buggée (peu probable si tu l'importes) soit les arguments contiennent des données erronées, ou alors il y a un problème dans la fonction LireCarte : mets-la voir en entier, notamment la déclaration de returnValue.
gmorello
Messages postés9Date d'inscriptionvendredi 22 décembre 2006StatutMembreDernière intervention 6 mars 2008 26 sept. 2007 à 09:37
Voici la declaration dans le .h de Lire Carte
--------------------------------
DLL_IMP unsigned short CALL_TYPE Hn_LectureVitale
( const short sTempsAttente,
char *pcDataOut,
unsigned int *puiLgDataOut,
short *psEtatCarte,
unsigned short *pusCodeErreur);
------------------------
ReturnValue est une chaine char returnValue[50] = "";
Mais je pense que cela vient directement de la fonction voici un exemple de debbug :
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 26 sept. 2007 à 18:34
OK je crois avoir compris :
quand tu appelles ta fonction tu lui passes en parametre DataOut un tableau de taille 1 (un pointeur vers simple char en fait); seulement au travers de l'argument puiLngDataOut tu lui dis qu'il s'agit d'un tableau de taille 10000 => forcément s'il a plus d'un caractère à écrire (ce qui semble être le cas) il va écrire dans une zone hors du tableau; comme celui-ci est sur la pile ca va entre autres modifier les autres variables déclarées.
Solution : tu initialises correctement LEC_TailleMemoire (à 1 taille du tableau), comme la fonction retourne sans doute une chaîne et pas un seul caractère tu augmentes la taille de ton tableau par exemple char DataOut[256] (avec LEC_... en conséquence, soit 256). Comme puiLngDataOut est un pointeur je suppose qu'il te retourne le nombre de caractères écrits dans la chaîne donc tu peux regarder sa valeur après appel de la fonction pour avoir un ordre de grandeur pour la taille de dataOut.