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 :

memcpy qui ne veut pas memcopier


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut memcpy qui ne veut pas memcopier
    Bonjour à tous !

    Tout d'abord, merci pour votre aide future !

    Voilà mon soucis j'utilise la fonction memcpy :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define   ADD_BINARY_ST         0x43800
    length_binary_st = addEndST - addBeginST;
    for( i=0; i<length_binary_st; i=i+sizeof(T_UINT32))
     {
      memcpy((T_CHAR*)ADD_BINARY_ST+i*sizeof(T_UINT32), (T_CHAR*)  addBeginST+i*sizeof(T_UINT32), sizeof(T_UINT32));
     }
    avec addBeginST égal à 0xFF663800

    Y a t-il quelque chose de mauvais la dedans ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 35
    Par défaut
    Je trouve que tu te compliques beaucoup la vie. J'aurais écris plutôt un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define   ADD_BINARY_ST         0x43800
    length_binary_st = addEndST - addBeginST;
    memcpy( (T_CHAR*)ADD_BINARY_ST, (T_CHAR*)  addBeginST, length_binary_st);
    Je ne vois pas pourquoi tu essayes de copier petit bout par petit bout un bloc d'octets, alors que la fonction memcpy sert à copier un bloc d'octets.
    Pour moi length_binary_st correspond au nombre d'octets que tu veux copier.

  3. #3
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    J'ai déjà essayé comme ça "basiquement" mais rien de concluant.

    J'essaye un peu tout ce qui me passe par la tête dont cette méthode en me disant que ça marcherait mieux si cela se fait pas à pas...Mais non...

    Je ne comprends pas et c'est pour cela que j'ai posté, je ne vois pas où est le probléme...

    Je pensais à un truc, est ce que le fait de mettre mon adresse "source" pour la copie dans un "unsigned long" pose probléme ?

    Autrement dit, pour le moment, j'ai ça :

    T_UINT32 addBeginST = 0xFF663800;

    alors que memcpy a besoin d'une zone mémoire...

  4. #4
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    A première vue, je ne vois rien de faux, même si l'utilisation de memcpy() est un peu étrange. Comment voyez-vous que cela ne fonctionne pas? Quel est le but?

  5. #5
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    Pour expliquer en gros, il faut que je charge des données d'une flashprom vers de la ram.
    j'ai un emulateur qui me permet de voir en "watchant" l'adresse de destination que le move ne se fait pas...

    Je ne comprends pas...Je vais me renseigner si il n'y aurait pas des autorisations d'ecriture lecture sinon je ne vois vraiment pas le probleme...

  6. #6
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Si le code proposé par Nemehy ne fonctionne pas, je ne vois pas non plus d'où peut provenir le problème.

  7. #7
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    Merci en tout cas pour votre aide !

  8. #8
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Qu'est-ce que le type T_UINT32? unsigned int (32 bits)?

  9. #9
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    Cela :

    typedef unsigned long T_UINT32;

    Et donc ui int de 32bits

  10. #10
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    A supposer que l'adresse de destination soit ADD_BINARY_ST et que celle de source soit addBeginST, alors, à mon avis, l'appel correct de memcpy() devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    length_binary_st = addEndST - addBeginST;
    memcpy(ADD_BINARY_ST,addBeginST,length_binary_st*sizeof addBeginST);

  11. #11
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    En fait, je pense avoir une idée.

    Vu que mon adresse "source" pour la fonction memcpy est dans une variable de type T_UINT32 "addBeginST", je pense que je prends comme adresse "source", non pas comme je le voudrais le contenu de la variable, mais l'adresse de la variable.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 35
    Par défaut
    Citation Envoyé par stephl
    A supposer que l'adresse de destination soit ADD_BINARY_ST et que celle de source soit addBeginST, alors, à mon avis, l'appel correct de memcpy() devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    length_binary_st = addEndST - addBeginST;
    memcpy(ADD_BINARY_ST,addBeginST,length_binary_st*sizeof addBeginST);
    Petite remarque, ce ne serait pas plutôt la taille de ce que pointe addBeginST et non pas la taille du pointeur ? du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TRUC * addBeginST;
    [...]
    length_binary_st = addEndST - addBeginST;
    memcpy(ADD_BINARY_ST,addBeginST,length_binary_st*sizeof(TRUC));
    ---
    EDIT (dsl, nexoo j'avais pas vu que tu avais posté) :
    a priori, je ne vois pas pourquoi tu prendrais l'adresse de la variable si tu ne mets pas de & devant celle-ci.
    Mets nous ton code en entier, ça sera peut-être plus simple...

  13. #13
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Nemehy
    Petite remarque, ce ne serait pas plutôt la taille de ce que pointe addBeginST et non pas la taille du pointeur ? du genre :
    D'après le type de addBeginST, non. Il semble que ce soit un entier dont la valeur est l'adresse source.

  14. #14
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    Voici donc pour resumer où j'en suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #define ADD_BINARY_ST 0x43800
     
    void fonction(unsigned long addBeginST, unsigned long addEndST)
    {
    ...
    length_binary_st = addEndST - addBeginST;
    memcpy((T_CHAR*)ADD_BINARY_ST, (T_CHAR*)addBeginST, length_binary_st);
    ...
    }
    Avec addBeginST contenant 0xFF663800, l'adresse à laquelle je souhaite faire le "move"...

  15. #15
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Je pense que le troisième paramètre de memcpy() n'est pas bon: cf post #10.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 35
    Par défaut
    En fait ce qui me parait le plus bizarre, c'est qu'il n'y ait même pas quelques octets qui aient été copiés...

    Sinon je ne pense pas qu'il faille multiplié par quoique ce soit :
    Avec T*p1 et T*p2, on a normalement équivalence :
    p2-p1 <=> ( (unsigned long)p1 - (unsigned long) p2 ) / sizeof( T )

    Ici addBeginST est de type unsigned long, donc il manque le type T dans l'équation, d'où une autre idée à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define ADD_BINARY_ST 0x43800
     void fonction(unsigned long addBeginST, unsigned long addEndST)
    {
    T_CHAR * p1 = addBeginST;
    T_CHAR * p2 = addEndST;
    ...
    length_binary_st = p2-p1;
    memcpy((T_CHAR*)ADD_BINARY_ST, p1, length_binary_st);
    ...
    }

  17. #17
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Oui, excusez-moi, vous avez raison. Il ne faut pas multiplier par la taille de unsigned long; en effet, la taille est ici calculée comme une différence d'entiers, pas de pointeurs... Mille excuses

  18. #18
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    Pas de problémes Stephl

    Sinon j'vais tester ton idée nemehy...

  19. #19
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    Bon ça ne marche toujours pas...

    Me suis renseigné, normalement pas de problémes d'accés donc je vais faire ça à la main avec deux pointeurs que je vais faire avancer...

    Encore merci à vous deux pour votre aide !

  20. #20
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Bizarre...
    Peut-être pouvez-vous essayer ainsi alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *dest=(char *) ADD_BINARY_ST;
    char *src=(char *) addBeginST;
    unsigned long length_binary_st=addEndST-addBeginST;
    unsigned long i;
     
    for (i=0;i<length_binary_st;++i) dest[i]=src[i]; /*ou *dest++=*src++*/
    Mais je reste perplexe devant le fait que memcpy appelée ainsi ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy(dest,src,length_binary_st);

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [JScrollPane] qui ne veut pas se mettre en haut a gauche
    Par Cyber@l dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 24/11/2006, 10h41
  2. [VB.NET]un formulaire qui ne veut pas se fermer
    Par josyde2006 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 18/08/2006, 08h29
  3. requetes qui ne veut pas passer
    Par suya95 dans le forum Requêtes
    Réponses: 14
    Dernier message: 04/07/2006, 14h17
  4. JOptionPane qui ne veut pas se fermer!
    Par benthebest dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 29/12/2005, 22h05
  5. un fichier qui ne veut pas être supprimé!!!!
    Par en_stage dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 22/10/2005, 01h08

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