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 :

comment concourner l'encodage des struc?


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut comment concourner l'encodage des struc?
    Bonjour,

    J'utilise Code::Blocks 10.05 avec MinGW / GNU GCC (4.4.1. mais pas sur.).
    Je déclare:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct In
    {
        unsigned int a;
        double b;
        double c;
        double d;
        double e;
        double f;
    };
    Pour lire "un tableau" de ces valeurs, qu'ils y ont étés laisser pas un autre processus.
    J'ai verifié dans "la ram" et je vois bien que 'a' est codé sur 4 Octets, et les autres variables sur 8 Octets, et que les différents bloc de données se suivent directement, comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    |----------------------------------------------------------------------|
    |----------------"1er struct"-------------------------------------------|
    | 4O |bloc de 8 octets|bloc de 8 octets|bloc de 8 octets|bloc de 8 octets|
    -----------------------------------------------------------------------|
    -----------------|------------"2nd struct"------------------------------|
    |bloc de 8 octets| 4O |bloc de 8 octets|bloc de 8 octets|bloc de 8 octets|
    -----------------------------------------------------------------------|
    ---------------------------------|-----------"3eme struct"-------------|
    |bloc de 8 octets|bloc de 8 octets| 4O |bloc de 8 octets|...........
    ----------------------------------------------------------
    mais mais quand j'appelle j'obtiens 48 à la place de 44.

    Je me dit qu'il me manque un élément assez important sur le fonctionnement et l'utilisation de struct....

  2. #2
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonjour,

    C'est normal, ça s'appelle l'alignement des structures.

    http://fr.wikipedia.org/wiki/Alignement_en_m%C3%A9moire

    Le compilo bourre ta structure comme suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct In
    {
        unsigned int a;
        char _bourrage[4];
        double b; //aligne sur 8
        double c;
        double d;
        double e;
        double f;
    };
    La taille est donc correcte pour chaque membre, mais la taille totale est augmenté d'un membre "fictif".


    Contourner ce mécanisme qui permet d'optimiser l'accès à la RAM en fonction des contraintes du processeur est une mauvaise idée.

    Si l'autre processus modifie l'alignement (ce qui m'étonnerait), il faut voir du coté de "pack" :
    http://gcc.gnu.org/onlinedocs/gcc/St...g-Pragmas.html

  3. #3
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    Je vais voire ca tous de suite...

    en faite ils faut que j'appelle une fonction qui "recopie" tous le tableau vers une autre variable, dans le premier processus, pour que je puisse travailler dessus corectement avec mon code. Le problèm c'est que je n'ai pas acces au code source, et le debuggage "normale" n'est pas disponible, car ils est bloqué..
    Et je suis en manque mflops, donc je préfère tout gérer depuis mon code..

    "Si l'autre processus modifie l'alignement (ce qui m'étonnerait)":
    a mon humble avis, ce n'est pas du c++, encore que.. mais des que je vue les premier dump je me suis dit que c'est fait exprès pour economisé la ram. Car a l'origine il n'est pas question de calcule intensif mais de stockage de beaucoup de donnée.

  4. #4
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    Super ca marche
    Merci.

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

Discussions similaires

  1. [Débutant] Comment connaitre le type d'encodage des fichiers textes ?
    Par saxrub dans le forum VB.NET
    Réponses: 1
    Dernier message: 30/03/2012, 11h26
  2. Comment modifier l'encodage des fichiers sources ?
    Par ChPr dans le forum NetBeans
    Réponses: 2
    Dernier message: 01/05/2007, 21h16
  3. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 17h41
  4. Comment obtenir la liste des paramètres d'une SP ?
    Par Le Gritche dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/03/2003, 16h54
  5. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14

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