Sauvegarder une adresse mémoire

gmorello Messages postés 9 Date d'inscription vendredi 22 décembre 2006 Statut Membre Dernière intervention 6 mars 2008 - 25 sept. 2007 à 17:07
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Derniè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
    [...]  

    Err = Hn_Lecture(0, &DataOut, &LEC_TailleMemoire, &EtatCarte, &Err_complement);
    if(Err ==0)
    {
        strcpy_s( returnValue, 50,"OK");
    }
    else
    {   
        strcpy_s( returnValue, 50,"ERR");
    }
   
    ReturnString( params, returnValue );
}

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.

merci .

3 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
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.
0
gmorello Messages postés 9 Date d'inscription vendredi 22 décembre 2006 Statut Membre Derniè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 :

Avant d'executer le fonction.

Apres executer la fonction
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
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.
0
Rejoignez-nous