begin process at 2012 05 30 10:33:56
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Utilisation de Memcpy et type de données


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Utilisation de Memcpy et type de données

jeudi 6 mars 2008 à 12:40:53 | Utilisation de Memcpy et type de données

mush74

Bonjour,

Un petit probleme (surement simple, étant nioub) a vous soumettre :

Je dispose d'une structure de ce type :

typedef unsigned short int   uint16;
typedef unsigned long int    uint32;

typedef struct
{
   uint32   d1;
   uint16   d2;
   uint32   d3;
} data;

Je reçois dans un tableau "tab" 10 octets. Donc de la meme taille que ma structure.

Lorsque je fais un memcpy(&data, &tab[0], 10); je m'attends a remplir ma structure avec les valeurs du tableau. Mais voila, ca ne marche pas du tout.En fait, lorsque je demande l'affichage des adresses mémoire de d1, d2 et d3, je m'appercois que je vais toujours de 4 octets en 4 octets.
Ex : 0x80000000, 0x80000004, 0x80000008.

Or, vu que d2 a une taille de 2 octets, je pensais obtenir plutot :
Ex : 0x80000000, 0x80000004, 0x80000006.

Evidemment, comme cela ne fonctionne pas, la valeur de data.d1 est correcte, mais après data.d2 et data.d3 sont fausses...

Le pire, c'est qu'en changeant d1 en type long, je passe bien a 8 octets:
Ex : 0x80000000, 0x80000008, 0x8000000b.

Au secours.
jeudi 6 mars 2008 à 12:50:01 | Re : Utilisation de Memcpy et type de données

BruNews

Administrateur CodeS-SourceS
Normal tout ceci comme expliqué déjà plusieurs fois sur ce forum.

Ta struct est bancale, les données sont mal alignées alors ton compilo les a correctement alignées sur 4.

Ta struct est donc en réalité:
typedef struct
{
  uint32   d1;
  uint16   d2;
  uint16   dummy;
  uint32   d3;
} data;

Il faut écrire:
typedef struct
{
  uint32   d1;
  uint32   d3;
  uint16   d2;
} data;
si tu ne veux pas que le compilo y retouche.

ciao...
BruNews, MVP VC++
jeudi 6 mars 2008 à 13:32:11 | Re : Utilisation de Memcpy et type de données

mush74

Complément d'info :
Je recois des valeurs dans un buffer (tableau). Ces données proviennent d'un GPS et envoie des trames au format Garmin. Les données sont envoyées "en série" de longueur variable, et placée dans une structure (nommé PVT data par Garmin) qui mélange les données de 16, 32 et 64 bits dans un ordre bien particulier.
 Donc a part faire un découpage de chaque valeur, il n'y a pas d'autres solutions ? Dans la trame Garmin, il n'y a pas de donnée "dummy". Meme si le découpage donnée par donnée peut fonctionner, je trouvais cela un peu "bricolage".

Enfin merci tout de même pour l'explication !!!

jeudi 6 mars 2008 à 14:05:24 | Re : Utilisation de Memcpy et type de données

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Bonjour,

Tu peux gérer la valeur de l'alignement.
Ca risque de dépendre du compilo, mais pour VC, il y a pragma pack.

Tu peux l'utiliser comme ça :
#include <stdio.h>
#include <stdlib.h>

typedef unsigned short int uint16;
typedef unsigned long int uint32;

typedef struct
{
uint32 d1;
uint16 d2;
uint32 d3;
} data;


#pragma pack(1)
typedef struct
{
uint32 d1;
uint16 d2;
uint32 d3;
} datap;
#pragma pack()

int main()
{
printf("Alignement par defaut : %d\n", sizeof(data));
printf("Alignement sur un octet : %d\n", sizeof(datap));
system("pause");
}

Ce genre de truc est a faire seulement si on est obligé, car cela peut fortement affecter les performances.
jeudi 6 mars 2008 à 14:19:10 | Re : Utilisation de Memcpy et type de données

BruNews

Administrateur CodeS-SourceS
Clair que si le format ne dépend pas de soi, il ne reste que pragma pack.

Attention que dans les données GPS, il y a du BigEndian mixé avec du LittleEndian dans les structures, c'est le souk.

ciao...
BruNews, MVP VC++
vendredi 7 mars 2008 à 10:57:11 | Re : Utilisation de Memcpy et type de données

mush74

Je vais essayer tout cela. Cela dit je suis sous Ubuntu / GCC 4.2 / Code::Blocks. Donc je ne pense pas que cette directive s'applique. Mais au pire il y a surement un équivalent. je vais chercher un peu et je repost dès que j'ai la solution.

A+

vendredi 7 mars 2008 à 11:09:21 | Re : Utilisation de Memcpy et type de données

rt15

Membre Club Administrateur CodeS-SourceS

Je viens de tester sous gcc/Code::Blocks/XP.
Aucun problème.

vendredi 7 mars 2008 à 12:05:29 | Re : Utilisation de Memcpy et type de données

mush74

#pragma pack a résolu mon probleme...

Je dispose enfin des bonnes valeurs de mon antenne GPS !!!

Merci a vous deux !



Cette discussion est classée dans : type, data, d1, octets, d2


Répondre à ce message

Sujets en rapport avec ce message

Probleme a la creation de matrices [ par feanor04 ] Bonjour a tous, j'aurais besoin de vos lumieres pour le probleme suivant: Je travaille en C (pas d'autre option) avec Eclipse (derniere version je cro comprendre le code [ par nouha23 ] je veu comprendre ce classe Networc-config-Dlg et son principe et éxplication de ses fonctions. /***************************************************** inverser les octets d'un type double [ par totoscill ] Bonjour,Je souhaite tourner les octets de données de type double (probleme de big endian/ little endian).Pour des données de type long ou short pas de aide pour dvpmt C [ par Stuntfire62 ] Bonjour,j' ai un pb pour un code en C, j'ai plusieurs choses a faire.je dois écrire une fonction permettant de comparer deux dates dans un tableau qui question [ par nouha23 ] je veu comprendre le code de ce class data-config svp et ces fonctions./**************************************************************************//* Charger des fonctions depuis une dll [ par HeXa2 ] Bonjour!Je viens de finir de compiler une DLL: H2BUSDLL.dllcette dll a pour but de gerer une communication sur le port com (que je vais interfacer ave


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales