IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème avec le chevauchement de mémoire


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut Problème avec le chevauchement de mémoire
    bonjour, cela fait un moment que je n'ai pas un de problème de ce genre en le c et moi on est pas très copains pour le moment voici le petit problème
    je déclare en préprocesseur un jolie petit petit tableau de caractère et celui-ci ce trouve écrasé par un autre dans une boucle et je sais pas comment l’évite: je vous montre le code c 'est plus simple : juste pour info la fonction row me renvoi un char* et donc le row a l'incide i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    char *store[7];
    char date[11];
    sprintf(date,"20%02d-%02d-01",REFMOIS/100,REFMOIS%100);
     
    check=bd2->getRow(true,"select ...") //renvoie un bool et accède au row via la fonction row d' un autre classe qui est éprouvée!!
     
    while (check)
    {	
        for (int i=0; i<7; i++)
        {
            store[i] =bd2->row(i);
            std::cout<<"valeur de store(i)"<<store[i]<<std::endl;
        }
        std::cout<<">>>>>>>>>>>>>>>ICI 2 date"<<date<<std::endl;
     
        ....
        ....
        bd->execquery("insert into cdr(source,refmois,date,heure,duree,taille,sms,prix,id_pays_roaming,id_partner_roaming,id_destination,id_calling,id_called,id_description,id_groupe,id_rate,id_rate_description,id_user,charge,expire) values(\"%s\",%d,\"%s\",\"00:00:00\",0,0,0,%s,1,1,1,%s,1,%lu,%s,1,1,%s,1,FROM_UNIXTIME(%lu))",TYPE,REFMOIS,date,store[5],store[3],id_description,store[4],store[2],store[6]);
    et je me suis dit que je pouvais utilisé un malloc mais du faite que je récupère ceux ci et donc les 7 row de taille variable, de ma query postérieur, pour les réinséré dans une autre BDD comme vous pouvez voir. quelqu'un a une piste ? une info de plus la chaine de caractères la plus longe serai de 19 caractères.

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    tu déclares un tableau de pointeurs, et copie seulement l'adresse que te retourne row().
    Il y a fort à parrier que row utilise un buffer fixe en interne, et que tu copie donc 7 fois la même adresse dans ton tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    std::vector<std::string> store;
    char date[11];
    sprintf(date,"20%02d-%02d-01",REFMOIS/100,REFMOIS%100);
     
    check=bd2->getRow(true,"select ...") //renvoie un bool et accède au row via la fonction row d' un autre classe qui est éprouvée!!
     
    while (check)
    {	
        for (int i=0; i<7; i++)
        {
            store.emplace_back(bd2->row(i);
            std::cout<<"valeur de store(i)"<<store[i]<<std::endl;
        }
    N'aies pas peur d'utiliser des vector / string en C++, dans le pire des cas ça te facilitera la vie.

    edit : tu parles de C dans ton post, et ton code est du C (à part un cout perdu).
    en C tu ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    char *store[7];
    char date[11];
    sprintf(date,"20%02d-%02d-01",REFMOIS/100,REFMOIS%100);
     
    check=bd2->getRow(true,"select ...") //renvoie un bool et accède au row via la fonction row d' un autre classe qui est éprouvée!!
     
    while (check)
    {	
        for (int i=0; i<7; i++)
        {
            int len = strlen(row(i));
            store[i] = (char*)malloc(len+1);
            memcpy(&store[i], row(i), len);
            store[i][len] = 0;
            //std::cout<<"valeur de store(i)"<<store[i]<<std::endl;
        }
    // sans oublier de free quand tu n'en a plus besoin.

Discussions similaires

  1. [AC-2007] problème avec "erreur 7" mémoire insuffisante
    Par rominous41 dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/07/2011, 13h49
  2. [XL-2003] Problèmes d'écriture avec ".Write" - Conservation en mémoire de données antérieures
    Par oliwan64 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/11/2009, 13h29
  3. Problème avec la mémoire
    Par regisyves dans le forum Débuter
    Réponses: 1
    Dernier message: 29/08/2009, 17h50
  4. [3D] Blender problème avec la mémoire
    Par VinnieMc dans le forum Développement 2D, 3D et Jeux
    Réponses: 18
    Dernier message: 06/04/2006, 19h42
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo