Problème d'allocation de tableau

[Résolu]
Signaler
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
-
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
-
Salut à tous, comme l'indique le sujet, j'essaie de remplir un tableau (tout bête me direz vous) et pis ben ça ne marche pas !

Contexte : C++ natif, avec MFC donc sous VS2005
                 Plateforme solution : Windows Mobile 2005 Emulateur

Je possède un tableau de chaines, chaque chaine étant composée de sous chaines séparées par des ;
comme ceci :
   L1    aaaaa;bbbbbbbbb;cccccccccc;dddddddddd;
    L2    eeeeeeeee;fffffffffff;gggggggggg;hhhhhhhh;
    L3    etc...
le but étant de stocker tout ça dans un autre tableau qui sépare chaque sous chaine pour plus de confort.
            C1   C2       C3   etc...
    L1   aaaaa   bbbb   ccccc  
    L2   eeeee   ffff   ggggg  
    etc...

Voici le code en cause :    m_strTabDBLine est un char ***, m_strTabBuffer un char ** et m_uiNbLignes un UINT
    char * pctmp, ctmp[100]= {0};
    int k=0;

    m_strTabDBLine = new char ** [m_uiNbLignes];    // alloue les lignes
    for (UINT i=0;i<m_uiNbLignes;i++)
    {
        m_strTabDBLine[i] = new char * [nbfields];    // alloue le nombre de champs par ligne
        pctmp = m_strTabBuffer[i];                    // fixe le pointeur en début de ligne
        for (int j=0;j<nbfields;j++)
        {
            k=0;
            while(pctmp[k] != ';')           
                ctmp[k] = pctmp[k++];                // récupère chaque caractère entre deux ;
            ctmp[k] = '\0';

            m_strTabDBLine[i][j] = new char [strlen(ctmp)];    //initialise le champ à la bonne taille
            strcpy(m_strTabDBLine[i][j],ctmp);                // le remplit avec la chaine

            pctmp = strstr(pctmp,";")+1;                    // saute jusqu'au prochain champ
        }
    }

Si je structure le tableau m_strTabBuffer, dans mon exemple, il contient ces caractères :
Nom;Prenom;Adresse;Code Postal;Ville;Pays;

// valeurs
nom01;prenom01;adresse01;CP01;ville01;pays01;
nom02;prenom02;adresse02;CP02;ville02;pays02;
etc...

J'ai noté le moment du bug avec la couleur et la mise en gras souligné.

Je trace donc l'exécution du programme et au début tout va bien.   Je vérifie les valeurs de mes variables tout se passe nickel.
Mais ensuite, lorsque le curseur atteint cette ligne, je fais F11 pour avancer en pas à pas et ça plante en me mettant ce message :

Unhandled exception at 0x03f8103c in OpenDB3.exe: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00299008.

et ça m'ouvre une page de code plex.cpp situé dans un dossier mfc de visual studio avec un curseur vert à l'endroit où j'ai mis ma flèche :

CPlex* PASCAL CPlex::Create(CPlex*& pHead, UINT_PTR nMax, UINT_PTR cbElement)
{
    ASSERT(nMax > 0 && cbElement > 0);    if (nMax 0 || cbElement 0)
    {
        AfxThrowInvalidArgException();
    }

>   CPlex* p = (CPlex*) new BYTE[sizeof(CPlex) + nMax * cbElement];
            // may throw exception
    p->pNext = pHead;
    pHead = p;  // change head (adds in reverse order for simplicity)
    return p;
}

Mes questions sont donc :
    - Savez vous pourquoi ça bug ?
    - Savez vous pourquoi ça ne bug pas avant ???

question subsidiaire   
    - Ai-je choisi le bon thème ?

Merci à toutes les bonnes âmes qui liront ce message et peut-être me répondront !

Loki

12 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
            m_strTabDBLine[i][j] = new char [strlen(ctmp)+1];   //initialise le champ à la bonne taille
            strncpy(m_strTabDBLine[i][j],ctmp, strlen(ctmp) + 1);                // le remplit avec la chaine

Le pb est ici. Remplace ces deux lignes, et ca roul.
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
au cas où ce ne soit pas très explicite, le bug survient à la ligne de code en rouge, ctmp == le mot en rouge dans le tableau et pas avantNom;Prenom;Adresse;Code Postal;Ville;Pays; ni même pour nom01;prenom01;

de plus je me suis trompé :  // valeurs n'apparaît pas dans le tableau.

donc le tableau est :
Nom;Prenom;Adresse;Code Postal;Ville;Pays;
nom01;prenom01;adresse01;CP01;ville01;pays01;
nom02;prenom02;adresse02;CP02;ville02;pays02;
etc...

voilà voilà merci à vous

Loki
Messages postés
115
Date d'inscription
samedi 29 mars 2003
Statut
Membre
Dernière intervention
19 décembre 2008
1
Salut loki !
Alors alors, j'ai vu un vieu pote et jme suis dis qu'il fallait que je prenne la peine de tout lire, donc je vais voir ce que je peux faire !

Le bug survient lors de l'enregistrement de la première ligne du tableau au niveau du champs adresse ? donc tu n'arrives pas à enregistrer l'adresse, tu as essayé d'afficher la valeur de ctmp poru voir si dejà tu travailles avec la bonne chaîne ?

-{ Saifer }-
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
yes man, en fait tu as lu des noms bateau car c'est des noms bateau réellement :D test oblige. en fait la toute première ligne passe toute seule, celle où y a pas de numéros. la deuxième, le nom et le prénom passent mais pas l'adresse.

bêtement j'ai constaté que ma chaine adresse01 était plus grande que toutes les autres déjà enregistrées. j'ai testé avec adresse0 mais ça passe pas évidemment :p

j'ai également essayé de voir la valeur de ctmp dans la fenêtre espion et il contient tout à fait ce que j'attends à chaque fois.

Loki
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
d'ailleurs tu constateras que le bug survient au moment de l'allocation, pas du remplissage avec ctmp.

Loki
Messages postés
115
Date d'inscription
samedi 29 mars 2003
Statut
Membre
Dernière intervention
19 décembre 2008
1
A première vu je ne vois pas, mais si tu m'envois ton code par mail, je regarderais, et je posterais la solution ici...

-{ Saifer }-
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
volontier :D

Loki
Messages postés
115
Date d'inscription
samedi 29 mars 2003
Statut
Membre
Dernière intervention
19 décembre 2008
1
Sinon par hasard, as tu vérifié que l'adresse que tu copies n'est pas plus grande que 100 caractères ?

-{ Saifer }-
Messages postés
115
Date d'inscription
samedi 29 mars 2003
Statut
Membre
Dernière intervention
19 décembre 2008
1
Sinon lorsque tu fais un strlen(ctmp) tu as bien une valeur correct ? essai de remplacer strlen(ctmp) par une valeur à la con genre 20 octets, et utilise strncpy à la place de strcpy pour copier seulement les 20 premiers octets de l'adresse, et dis moi si ca fonctionne.

-{ Saifer }-
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
en fait l'adresse ne peux pas être plus grande que 100 octets étant donné que l'adresse est : adresse01.
pour strlen(cmp) je ne sais pas mais puisque ça fonctionnait pour les autres... mais je vais essayer de tester.
par contre ca merdouille un peu là, jpense que je vais rentrer on continuera sur MSN.

Loki
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
c'est pas bête ça, pas bête du tout !!! je teste et je vous dis

Loki
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
Bon ben ça roule ma poule. merci c'était pas plus compliqué que ça. quelle LOOSE !!!
bref merci luhtor merci à saifer aussi. je vais me pendre j'ai trop honte.

Loki