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 char* byte*


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Par défaut memcpy char* byte*
    Bonjour,

    Voilà j'ai un souci de copy d'un buffer dans un autre buffer, alors je vous présente le problème :

    J'ai une méthode où je calcule une variable pb à l'aide d'une autre fonction que je veux copier dans le parametre par...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    methode(char ***par)
    {
     
      unsigned char pb[36];
     
      fonction((BYTE*)&pb);
     
      memcopy((*par)[i],pb,36);
     
    }

    Mais je crois que je fais mal la copie (en fait j'en suis sur puisque ça marche pas)
    Est ce que quelqu'un pourrait m'aider ?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    C'est plus du C que du C++.
    Supposons que tes pointeurs sont bons et qu'ils pointent sur une zone effectivement allouée.
    Tu déclares un tableau de 36 caractère sur la pile. Ce tableau commence à l'adresse pb ou &(pb[0]). &pb c'est l'adresse de la variable pb et non du tableau qu'il contient. Donc, il est fort à parier que la ligne :
    n'est pas correcte et que ça devrait être :
    D'autre part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcopy((*par)[i],pb,36);
    suppose que par par est un pointeur sur un tableau avec au moins i+1 éléments de type tableau sur char d'au moins 36 caractères. Tout cela m'a l'air très bancal et je ne peux que te conseiller de revoir tes modèles de données.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    C'est plus du C que du C++.
    Supposons que tes pointeurs sont bons et qu'ils pointent sur une zone effectivement allouée.
    Tu déclares un tableau de 36 caractère sur la pile. Ce tableau commence à l'adresse pb ou &(pb[0]). &pb c'est l'adresse de la variable pb et non du tableau qu'il contient. Donc, il est fort à parier que la ligne :
    n'est pas correcte et que ça devrait être :
    D'autre part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcopy((*par)[i],pb,36);
    suppose que par par est un pointeur sur un tableau avec au moins i+1 éléments de type tableau sur char d'au moins 36 caractères. Tout cela m'a l'air très bancal et je ne peux que te conseiller de revoir tes modèles de données.
    Oui désolé, comme je travaille sur les deux langages en ce moment dans le meme projet, je me melange. Bref, je vais donner plus de details :

    En fait la fonction "fonction" c'est une fonction microsoft :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cByte = 36;
    lres = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, (BYTE*)&pb, &cByte);
    Et cette ligne est correcte et je récupère bien les données voulues dans pb.

    Après c'est vraiment le memcpy que je sais pas faire. Je veux juste copier ce que j'ai dans pb, dans (*par)[i]

    "par" je l'ai initialisé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    *par    = (char**)calloc(*readers_found,sizeof(char*));
     
    ...
     
    (*par)[pos] = NULL;

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par specialka Voir le message
    En fait la fonction "fonction" c'est une fonction microsoft :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cByte = 36;
    lres = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, (BYTE*)&pb, &cByte);
    Et cette ligne est correcte et je récupère bien les données voulues dans pb.
    Je suis surpris. Car le MSDN spécifie que soit cByte vaut SCARD_AUTOALLOCATE et effectivement il alloue le bloc mémoire, soit tu donnes une valeur (ici 36) et auquel cas, tu devrais fournir pb et non &pb.

    Citation Envoyé par specialka Voir le message
    Après c'est vraiment le memcpy que je sais pas faire. Je veux juste copier ce que j'ai dans pb, dans (*par)[i]

    "par" je l'ai initialisé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    *par    = (char**)calloc(*readers_found,sizeof(char*));
     
    ...
     
    (*par)[pos] = NULL;
    memcpy copie une zone mémoire vers une autre. Ta zone cible d'après le code que tu me fournis n'est pas alloué. Ca m'a l'air d'être l'équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     memcopy((*par)[i],pb,36);
    // devient :
     memcopy(NULL,pb,36);
    Tu dois avoir une erreur de segmentation non ?
    En C, je pense que tu devrais avoir quelque chose comme ça (poser la question dans le forum C directement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*par)[pos] = malloc(36);

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Par défaut
    oui c'était bien ça, j'avais oublié d'allouer la mémoire, je m'en suis aperçu juste apres. C'est ça de se melanger les pinceaux entre le c et le c++. Merci beaucoup 3DARchi.

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

Discussions similaires

  1. memcpy char* vers u_short
    Par Trademark dans le forum Débuter
    Réponses: 4
    Dernier message: 18/06/2011, 09h23
  2. conversion de LPVOID à CHAR et de CHAR à BYTE
    Par bentley71de dans le forum Visual C++
    Réponses: 7
    Dernier message: 04/06/2008, 11h45
  3. transformation char byte
    Par hamma2 dans le forum Langage
    Réponses: 1
    Dernier message: 23/05/2007, 12h04
  4. probleme de BYTE[8] et de char*
    Par LesLemmings dans le forum C++
    Réponses: 21
    Dernier message: 12/04/2007, 13h16
  5. char -> byte
    Par zan001 dans le forum Langage
    Réponses: 1
    Dernier message: 11/10/2005, 17h02

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