Tableau de caractères, problème de récupération de valeurs

Résolu
cs_Arkael Messages postés 4 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 25 juillet 2008 - 24 juil. 2008 à 11:51
cs_Arkael Messages postés 4 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 25 juillet 2008 - 25 juil. 2008 à 09:37
Bonjour à tous.

J'ai un souci actuellement sur un de mes programmes professionels. Je vous expose le maximum d'information en esperant qu'un dieu du C/c++ puisse me dépanner.

J'ai une DLL dev sous Visual Studio 6 qui comporte une fonction :

INT CWiFi::ListWlanAdapters()
{
    char *m_cAdapters[MAX_ADAPTERS]; // MAX_ADAPTERS = 4
    memset(m_cAdapters, 0, sizeof(m_cAdapters));

    int nNumberAdaptersFound = m_pfn_ds_get_adapters(m_cAdapters, MAX_ADAPTERS);
    CString test = cAdapters[0];
    ODS("lecture tableau : %s", test); // permet l'affichage dans un ptit logiciel de la valeur du tableau [0]

    for (int cmpt = 0; cmpt < MAX_ADAPTERS; cmpt++)
    free(m_cAdapters[cmpt]);

    return nNumberAdaptersFind;
}

La fonction : m_pfn_ds_get_adapters fait appel a une DLL dvp sur visual studio 2005, qui elle même sert de Wrapper pour intégrer une Lib fournit par une société extérieure.
nNumberAdaptersFounf retourne le nombre de carte Wifi présent sur le poste : cette variable est bien récupéré comme il faut.

Le probleme se situant lorsque je souhaite affiché la première ligne du tableau récupéré qui normalement devrait retourné une chaine de caractère ressemblant à : {4345JGREE-FR5678-FR544554-565666}
Lors de l'affichage moi je récupère qq chose ressemblant à : IP³ (ou P est en fait à l'envers et tout noir)

voici l'entrée dans la Dll :

INT WINAPI ds_get_adaptersExp(char *adapters[], int max_adapter)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CChWps CChWps;

    char *m_adapters[MAX_ADAPTERS];
    memset(m_adapters, 0, sizeof(m_adapters));

    int Res =  CChWps.get_adapters(m_adapters, max_adapter);

    for (int i = 0; i < Res; i++){
        adapters[i] = m_adapters[i];
    } // remplissage du tableau passé en paramètre de sortie

    for (int i = 0; i < 4; i++)
        free(m_adapters[i]);
    return Res;
}
La fonction get_adapters est la suivante et ressemble bcp à la précédente :

int CChWps::get_adapters(char *adapters[], int max_adapter)
{
    char *m_adapters[MAX_ADAPTERS];
    memset(m_adapters, 0, sizeof(m_adapters));

    int Res = ds_get_adapters(m_adapters, max_adapter);

    for (int i = 0; i < Res; i++){
        adapters[i] = m_adapters[i];
    }
    for (int i = 0; i < max_adapter; i++)
    free(m_adapters[i]);

    return Res;
}
la fonction ds_get_adapters(char* adapters[], int max_adapter) est celle provenant de la lib compillée dans la DLL. Sachant qu'elle fonctionne correctement et retourne la bonne valeur dans le tableau.

Je n'arrive pas à comprends la bourde que j'ai pu faire qui doit se situer dans le remplissage de mon second tableau passé en paramètre de sortie de mes fonctions, et qui me permet de transiter le tableau jusqu'à l'endroit voulu.

Est ce que quelqu'un aurait une idée à me formuler pour résoudre ce probleme qui me bloque depuis 4 heures déjà !

Merci d'avance.

3 réponses

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
24 juil. 2008 à 21:21
Bonsoir,

Il y a un point qui me semble suspect. Lorsque tu fais une opération comme celle-ci :

for (int i = 0; i < Res; i++)
    adapters[i] = m_adapters[i];

tu ne recopies pas des chaînes de caractères, mais juste un tableau de pointeurs ; donc, par la suite, lorsque tu fais :

for (int i = 0; i < max_adapter; i++)
    free(m_adapters[i]);

ton tableau m_adapters[] est nettoyé, mais les chaînes référencées dans adapters[] aussi... ce qui pourrait expliquer ton affichage erroné.
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
24 juil. 2008 à 21:32
Salut,

Mélanger du C et de c++ MFC est une erreur.
m_adapter devrait être un CString déclaré en tant que membre de l'objet wrapper.

Ceci devrait marcher si j'ai bien compris ce code bizarre et si les chaines sont allouées avec malloc avant

for (int i = 0; i < Res; i++){
       // adapters[i] = m_adapters[i];
       strcpy(adapters[i], m_adapters[i]);
}

Sinon, affecter un CString avec une chaine C :
CString test((const char*)cAdapters[0]);
0
cs_Arkael Messages postés 4 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 25 juillet 2008
25 juil. 2008 à 09:37
Merci à vous deux pour vos réponses, effectivement j'ai trouvé l'erreur après moult test.

Le souci était bien celui exposé par lucky92 il suffisait simplement de supprimer :

for (int i = 0; i < max_adapter; i++)
    free(m_adapters[i]);

pour regler le souci.

Pour Yann_lo_san le remplissage du tableau en pointeur peut parfaitement se remplir de ma manière comme de la tienne, celà ne pose pas de souci.

Merci encore d'avoir intervenu.
0
Rejoignez-nous