Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1686 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Utilisation de memcpy

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Utilisation de memcpy

n°1006672
kowalski
Posté le 09-03-2005 à 12:48:46  profilanswer
 

Sous les ordres de chrisbk j'ai utilisé memcpy,
 
Sauf que j'ai un petit problème
 

Code :
  1. #include <iostream>
  2. int main()
  3. {
  4.     short buffer[2];
  5.     long valeur;
  6.     buffer[0] = 0x0001;
  7.     buffer[1] = 0x2000;
  8.     memcpy(&valeur, &buffer[0], 4);
  9.    
  10.     std::cout << valeur;
  11. }


 
Personnellement ce que j'aimerais, c'est buffer[0] + buffer[1] donne :
0x00012000, or là, ca donne 0x20000001 !
 
Il suffirait d'intervertir me direz vous, mais non ;) En réalité mon buffer est bien plus gd et se range dans une structure ;)
 
edit : Au fait mon code est en C++, là je sais que memcpy c'est très C-like
Alors si vous avez une commande en C++...


Message édité par kowalski le 09-03-2005 à 13:02:25
mood
Publicité
Posté le 09-03-2005 à 12:48:46  profilanswer
 

n°1006686
kowalski
Posté le 09-03-2005 à 13:02:02  profilanswer
 

C'est pas un up, c'est juste pour dire que je peux éventuellement passer par un fichier en faisant fwrite/fread, mais spabo et c'est lent
Je sais que j'en ai déjà discuté avec chrisbk sur un autre topic, le memcpy était satisfaisant, mais c'est logique qu'il traite le buffer comme ca, donc ca ne peut pas me convenir pour ce que je fais... :/


Message édité par kowalski le 09-03-2005 à 13:03:22
n°1006690
videaste95
je ne sais rien !
Posté le 09-03-2005 à 13:05:53  profilanswer
 

   Les données en mémoire sont toujours écrites de l'octet le moins élevé au plus élevé. si j'ai un registre qui contient 0001, les données en mémoires seront 01 00. Si mon registre contient 00012000 en mémoire il y aura 00 20 01 00. Or tu as chargé 01 00 puis 00 20 soit 01 00 00 20 qui rechargé dans un registre donnent 20000001. Si tu ne veux pas avoir à faire ces convertions, utilise une union.

n°1006736
Taz
bisounours-codeur
Posté le 09-03-2005 à 13:36:00  profilanswer
 

tu veux faire quoi ?

n°1006790
kowalski
Posté le 09-03-2005 à 14:04:31  profilanswer
 

J'ai un buffer provenant d'une carte avec par exemple
0x5124 0x5478 0x2575 0x2477 etc etc.
Que je range dans une structure
 
long Champ1 (0x51245478)
short Champ2 (0x2575)
short Champ3 (0x2477)
 
Le buffer est bien évidemment plus long et la structure très longue aussi, donc je pensais utiliser memcpy...

n°1006806
kowalski
Posté le 09-03-2005 à 14:12:05  profilanswer
 

videaste95 a écrit :

Les données en mémoire sont toujours écrites de l'octet le moins élevé au plus élevé. si j'ai un registre qui contient 0001, les données en mémoires seront 01 00. Si mon registre contient 00012000 en mémoire il y aura 00 20 01 00. Or tu as chargé 01 00 puis 00 20 soit 01 00 00 20 qui rechargé dans un registre donnent 20000001. Si tu ne veux pas avoir à faire ces convertions, utilise une union.


 
Si j'utilise une union, ca va me tuer mon arithémtique de pointeurs dans ma structure que j'utilise pour naviguer/afficher/modifier des valeurs...

n°1006808
kowalski
Posté le 09-03-2005 à 14:13:18  profilanswer
 

kowalski a écrit :

C'est pas un up, c'est juste pour dire que je peux éventuellement passer par un fichier en faisant fwrite/fread, mais spabo et c'est lent
Je sais que j'en ai déjà discuté avec chrisbk sur un autre topic, le memcpy était satisfaisant, mais c'est logique qu'il traite le buffer comme ca, donc ca ne peut pas me convenir pour ce que je fais... :/


 
J'étais persuadé que fwrite/fread faisait le contraire mais en fait c'est exactement la même chose (bien évidemment, c'est logique), bon bah là ce n'est pas une impasse, mais c'est la merde dirons nous

n°1006809
HelloWorld
Salut tout le monde!
Posté le 09-03-2005 à 14:13:27  profilanswer
 

Probleme liitle endian je suppose. Sous Intel les nombres 16/32 bits sonr organisés ainsi en mémoire.
Tu peux définir ta struct et faire un cast sauvage sur ton buffer...

Code :
  1. struct MaStruct
  2. {
  3.     long Champ1;
  4.     short Champ2;
  5.     short Champ3;
  6. };
  7. unsigned char * buffer = ReadRawData();
  8. MaStruct * s = reinterpret_cast<MaStruct*>( buffer );


 
Faut gérer le pragma pack aussi généralement avec ce genre de truc pour pas que le padding dans ta struct crée des surprises...


Message édité par HelloWorld le 09-03-2005 à 14:14:49

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1006814
kowalski
Posté le 09-03-2005 à 14:15:42  profilanswer
 

Je vais tester ca, les "..." parlant du cast sauvage veulent dire que ce n'est pas très très recommandé ?

n°1006816
kowalski
Posté le 09-03-2005 à 14:16:32  profilanswer
 

c'est bon t'inquiete il y a des pragma à la pelle ;)

mood
Publicité
Posté le 09-03-2005 à 14:16:32  profilanswer
 

n°1006829
kowalski
Posté le 09-03-2005 à 14:22:25  profilanswer
 

HelloWorld, ReadRawData se trouve dans quelle librairie ?

n°1006863
Taz
bisounours-codeur
Posté le 09-03-2005 à 14:36:31  profilanswer
 

ben si ta structure est le mapping parfait de ce que tu lis, pourquoi tu lis pas directement dedans ?

n°1006870
kowalski
Posté le 09-03-2005 à 14:37:49  profilanswer
 

Parce que c'est trop long, il y a trop de champs, et je voulais une fonction d'affichage commune pour toutes mes structures (yen a une 30aine)
 
Taz tu sais toi comment utiliser readrawdata ?

n°1006876
Taz
bisounours-codeur
Posté le 09-03-2005 à 14:40:29  profilanswer
 

je sais pas ce que c'est readrawdata() et je comprends pas ou est le problème dans tout ça. Et quand bien même tu ne saurais pas faire les opérations binaire, l'arithmétique entière classique fonctionne tout aussi bien.

n°1006883
kowalski
Posté le 09-03-2005 à 14:43:24  profilanswer
 

videaste95 a bien expliqué le problème côté mémoire, oublions les 30aines de structures, s'il n'y a pas de fonction telle que memcpy faisait tout seul le boulot pendant que j'écarte les doigts de pieds sur une plage au soleil, je passerais évidemment par de l'arithmétique de pointeurs

n°1006890
Taz
bisounours-codeur
Posté le 09-03-2005 à 14:45:20  profilanswer
 

« Les données en mémoire sont toujours écrites de l'octet le moins élevé au plus élevé. »
 
quand je vois ce genre de truc ...  
 
fais comme tu veux, tu te fais chier sur un problème là où il n'y en a pas.

n°1006903
kowalski
Posté le 09-03-2005 à 14:53:45  profilanswer
 

Taz a écrit :

« Les données en mémoire sont toujours écrites de l'octet le moins élevé au plus élevé. »
 
quand je vois ce genre de truc ...  
 
fais comme tu veux, tu te fais chier sur un problème là où il n'y en a pas.


 
C'est très mignon.
Je vais faire comme je veux pour résoudre mon problème qui est bien là

n°1007243
HelloWorld
Salut tout le monde!
Posté le 09-03-2005 à 20:06:32  profilanswer
 

ReadRawData c'est l'exemple censé représenter "un buffer provenant d'une carte".
Mais si tu lis ça dans un fichier, comme le dit Taz tu fais un fread directement avec ta struct...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1007324
kowalski
Posté le 09-03-2005 à 21:12:50  profilanswer
 

fread : Bien sur mais pas dans le cas expliqué avec des mots de 16 bits qui doivent former des mots de 32b ou 64b
 
J'ai géré mon affaire cette après midi, c'était plus pour savoir si des fonctions existaient et éviter de réinventer la roue

n°1007364
Taz
bisounours-codeur
Posté le 09-03-2005 à 21:20:15  profilanswer
 

ben memcpy, istream::read, etc ...

n°1010056
kowalski
Posté le 11-03-2005 à 17:02:41  profilanswer
 

Taz a écrit :

ben memcpy, istream::read, etc ...


 
Tu n'as toujours pas compris mon problème, et tu insistes...
Je sais que tu as un niveau infiniment meilleur que moi en C++, mais quand même...
J'avais des fichiers bruts de type : "0x2540 0x2547 0x5757 0x7227 0x5725"
à ranger dans uns structure de données avec des short, des longs, des float, des double...
Je veux que mon premier champ, qui par exemple est long contienne 0x25402547 (les deux mots de 16b collés). Or avec memcpy pour les raisons expliquées contient 0x25472540.
 
Voilà. Mais mon pb est reglé.
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Utilisation de memcpy

 

Sujets relatifs
utilisation du shell en vba pour outlookutilisation du crypt
Port série, Linux & Utilisation non-standardSOS utilisation de AXIS pour dvp un webservice
J2ME -> Utilisation de KXmlRPC: blocage au 256ème caractère de réponseJTREE utilisation de JTree.AccessibleJTree et de setVisible
Probleme avec Target et utilisation des balises divUtilisation des relations ships et de JBoss (+EJB)
Utilisation de AS dans un SELECTUtilisation de control progress
Plus de sujets relatifs à : [C++] Utilisation de memcpy


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR