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 memcpy


Sujet :

C

  1. #1
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut Problème avec memcpy
    Bonsoir,

    Un soucis bizarre avec memcpy.
    J'ai le code suivant:
    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
    20
    21
     
    pmBaseAddress = FS_NvmAddressGet(FS_Nvm_PostMortem);
    if(0 == pmBaseAddress)
        printf("\n------ERROR to get starting address of Post Mortem file------\n");
    else printf("\nValeur de pmBaseAddress: 0x%x\n",pmBaseAddress);
        pmAddress = pmBaseAddress;
     
    indexBuf = (indexBuf+1) % SavedContextNum;
     
    printf("Valeur de pmAddress:0x%x   pmBaseAddress:0x%x\n",pmAddress,pmBaseAddress);
     
    UInt32 *address;
    address = FS_NvmAddressGet(FS_Nvm_PostMortem);
    printf("Valeur de address: 0x%x\n",address);
     
    address = memcpy((void*)&pmAddress,(char*)&TaskInfoBuf[indexBuf], sizeof(tracePostMortem));
     
    printf("Valeur de address: 0x%x\n",address);
    printf("Valeur de pmAddress:0x%x   pmBaseAddress:0x%x\n",pmAddress,pmBaseAddress);
    pmAddress = pmBaseAddress + (indexBuf * (sizeof(tracePostMortem)) % sizeof(TaskInfoBuf));
    printf("Valeur de pmAddress:0x%x   pmBaseAddress:0x%x\n",pmAddress,pmBaseAddress);
    Donc je récupère l'adresse de début d'un fichier nvm(Non volatile memory) qui a pour valeur 0xffe09bc.
    Je désire écrire l'entiéreté d'une structure à partir de l'address de base du fichier à l'aide memcpy.
    memcpy retourne un pointeur sur la destination. Déjà, cette valeur est différente et j'obtiens address = 0x2d18e8.
    Outre ce fait, les variables pmAddress et pmBaseAddress sont nulles une fois la fonction memcpy exécutée. Pourquoi cela? Surtout que je ne touche jamais à pmBaseAddress...

    Le résultat des printf:
    Valeur de pmBaseAddress: 0xffe09bc
    Valeur de pmAddress:0xffe09bc pmBaseAddress:0xffe09bc
    Valeur de address: 0xffe09bc
    Valeur de address: 0x2d18e8
    Valeur de pmAddress:0x0 pmBaseAddress:0x0
    Valeur de pmAddress:0x20 pmBaseAddress:0x0
    Merci de votre aide car j'ai vraiment du mal à comprendre d'où vient le problème.

    Bonne soirée.

    Nicolas

  2. #2
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par homeostasie
    [...]
    address = memcpy((void*)&pmAddress,(char*)&TaskInfoBuf[indexBuf], sizeof(tracePostMortem));
    [...]
    [/CODE]
    Si "address" et "pmAddress" sont déclarés comme des pointeurs, c'est normal que le comportement soit indéfini. En effet, tu passes l'adresse du pointeur à la fonction "memcpy" au lieu du pointeur. Cette adresse correspond à une adresse qui se trouve en pile (si pointeurs déclarés en variable automatique). Dans ton cas cette adresse est 0x2d18e8. Donc "memcpy" va copier les données source vers cette adresse. Bonjour les dégats....
    Donc c'est normal que le comportement soit indéfini.

    Il faudrait que ton code ressemble a ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    unsigned int *address;
    unsigned int *pmAddress;
    [...]
    // En supposant que FS_NvmAddressGet retourne un unsigned int *
    pmBaseAddress = FS_NvmAddressGet(FS_Nvm_PostMortem);  
    [...]
    address = memcpy (pmAddress, (char*)&TaskInfoBuf[indexBuf], sizeof(tracePostMortem));

  3. #3
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Bien en gros merci, je me suis mélangé un peu les pinceaux en voulant tenté plusieurs choses en même temps.

    Par contre, une chose dont j'avais omis, c'est honteux mais on ne sait jamais ca pourrait servir à nouveau à quelqu'un, la principale source de mon erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tracePostMortem buffer[SavedContextNum];
    memcpy((char *)&buffer[i],localpmAddress, sizeof(tracePostMortem));
    Ici on copie bien à l'adresse de buffer[i].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tracePostMortem buffer[SavedContextNum];
    memcpy((char *)&buffer,localpmAddress, sizeof(SavedContextNum * tracePostMortem));
    Ici, je croyais enregistré l'ensemble de mes données à l'adresse du buffer mais non, je copie à l'adresse de l'adresse du buffer.

    Et fonc faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tracePostMortem buffer[SavedContextNum];
    memcpy((char *)buffer,localpmAddress, sizeof(SavedContextNum * tracePostMortem));
    Voilà, infos à ceux qui pourraient se mélanger un peu comme moi.

    Bonne journée

    Nicolas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec memcpy
    Par kahrah dans le forum Débuter
    Réponses: 5
    Dernier message: 20/12/2013, 11h15
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. 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