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 :

Définition de structure


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut Définition de structure
    bonjours,

    j'ai défini une structure comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct _StructVLAN
    {
    	char Enb;  //bool 1 ou 0 
    	char ID[5]; // chiffre écrit en ASCII entre 0 et 4095
    	char Priority; //bool 1 ou 0 
    	char Member[5]; // chiffre écrit en ASCII sur 5bits
    	char Tagged[5]; // chiffre écrit en ASCII sur 5bits
    } StructVLAN;
     
    extern StructVLAN TabVLAN_Filter[16];
    => j'utilise ce code dans un petit µControlleur et le problème est que le tableau prend trop de place en RAM : y a t-il un moyen de reduire la taille de ce tableau sans que ça devienne une usine à gaz ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ta structure fera toujours au minimum 17 octets, mais il est possible d'éviter qu'elle prenne plus (18, 20...) selon le compilateur : Il existe généralement une syntaxe pour dire "pas d'octets de bourrage dans la structure".

    Déjà, fais un coup de sizeof() sur la structure pour connaître sa taille "vue du compilo"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et aussi si vraiment tu veux compacter, comme tu as 3 variables sur 5 bits, tu pourrais définir une variable char[2], et stocker tes 3 nombres en les codant à la suite ... Moins lisible mais plus compact : 2 char au lieu de 15..


  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
    Si je ne me suis pas trompé, votre tableau a donc une taille de 272 octets.
    De combien de RAM disposez-vous?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    je me demandais s'il n'etait pas possible d'enlever les bit inutile

    ex: ma variable Enb vaut 1 ou 0 alors qu'elle est codée dans un char (8bit) => donc il y a 7 bit d'inutilisé (pareil pour la variable Priority)
    Après, il y a mes nombres écrit en ASCII que je dois pouvoir convertir en binaire (ils sont en ASCII car c'est plus facile de les manipuler pour emettre/recevoir sur un port série) => il doit y avoir moyen de gagner de la place la-dedans aussi....

    Ne peut-on pas sérialiser/deserialiser simplement mes données (je suis debutant) ?

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je rajouterais même pour faire encore plus compact (3 octets de structure) tout coder sur char[3]...

    C'est un format de compression de ce style utilisé par exemple par l'Organisation Mondiale de Météorologie pour stocker les modèles numériques.
    [format GRIB]

    Vous codez bit à bit , et vous décodez également bit à bit...

    Lisibilité directe minimale mais compression maximale...

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Et des champs de bits ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    Citation Envoyé par souviron34
    je rajouterais même pour faire encore plus compact (3 octets de structure) tout coder sur char[3]...

    C'est un format de compression de ce style utilisé par exemple par l'Organisation Mondiale de Météorologie pour stocker les modèles numériques.
    [format GRIB]

    Vous codez bit à bit , et vous décodez également bit à bit...

    Lisibilité directe minimale mais compression maximale...
    => Vous avez des exemples de fonctions qui permettent de simplifier la lecture et l'ecriture des données avec cette technique ?
    je pensais à une focntion du style read_bit(ligne_tableau, variable)...

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Médinoc
    Ta structure fera toujours au minimum 17 octets, mais il est possible d'éviter qu'elle prenne plus (18, 20...) selon le compilateur : Il existe généralement une syntaxe pour dire "pas d'octets de bourrage dans la structure".

    Déjà, fais un coup de sizeof() sur la structure pour connaître sa taille "vue du compilo"...
    A priori, avec des char, on ne devrait pas rencontrer trop d'octet de bourrage destinés à satisfaires d'éventuelles contraintes d'alignement. Sinon, en ce qui concerne la réduction de la taille de ton tableau statique, analyse attentivement tes besoins afin de déterminer la taille minimum dont tu as besoin. Sinon, a part utiliser l'allocation dynamique pour réduire la taille des tableaux au strict minimum, je vois pas (toutefois, le coût mémoire de l'allocation dynamique engendre l'utilisation d'un pointeur supplémentaire).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    Membre éclairé Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Par défaut
    Attention dans tes commentaires tu ne fais pas la différence entre bits et bytes ou octet de la taille d'un char (en générale).

    Si tel que tu l'écrit tu manipule des bits et pas des bytes, tu devrais déclarer ta structure plutot comme-ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct _StructVLAN
    {
    	unsigned long Enb:1;  //bool 1 ou 0 
    	unsigned long ID:12; // chiffre écrit en ASCII entre 0 et 4095
    	unsigned long Priority:1; //bool 1 ou 0 
    	unsigned long Member:5; // chiffre écrit en ASCII sur 5bits
            unsigned long Tagged:5; // chiffre écrit en ASCII sur 5bits
     
    } StructVLAN;
    tu manipulais une structure de 17 char ou 17 bytes maintenant tu as une structure mappée sur un long de 4 bytes (sous win32).

  11. #11
    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 ronan99999
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct _StructVLAN
    {
    	unsigned long Enb:1;  //bool 1 ou 0 
    	unsigned long ID:5; // chiffre écrit en ASCII entre 0 et 4095
    	unsigned long Priority:1; //bool 1 ou 0 
    	unsigned long Member:5; // chiffre écrit en ASCII sur 5bits
            unsigned long Tagged:5; // chiffre écrit en ASCII sur 5bits
    
    } StructVLAN;
    Pour l'ID, je pense que c'est plutôt 12 bits.

  12. #12
    Membre éclairé Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Par défaut
    Oui effectivement.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    Enb = 1bit
    ID = 12bit
    Priority = 1bit
    Member = 5 bit
    Tagged = 5 bit
    => total = 3 bytes : ça existe des variable à 3 bytes (un unsigned long c'est 4, non ?) ?

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je pense que tu auras du mal à compresser plus : Tu peux tester sur ta plate-forme : Ta structure champ de bits pourrait faire 3 bytes, ou 4...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    on a pas le droit d'ecrire un truc dans le genre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    typedef struct _StructVar3Bytes
    {
         unsigned char Tab[3];
    } StructVar3Bytes;
     
    typedef struct _StructVLAN
    {
    	StructVar3Bytes Enb:1;  //bool 1 ou 0 
    	StructVar3Bytes ID:12; // chiffre écrit en ASCII entre 0 et 4095
    	StructVar3Bytes Priority:1; //bool 1 ou 0 
    	StructVar3Bytes Member:5; // chiffre écrit en ASCII sur 5bits
            StructVar3Bytes Tagged:5; // chiffre écrit en ASCII sur 5bits
     
    } StructVLAN;
     
    extern StructVLAN TabVLAN_Filter[16];

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À quoi ça servirait précisément ?
    Je ne vois pas trop ce que tu cherches à faire, là...

    Edit: Même après modification, je ne comprends toujours pas à quoi ça pourrait servir...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Emcy
    Enb = 1bit
    ID = 12bit
    Priority = 1bit
    Member = 5 bit
    Tagged = 5 bit
    => total = 3 bytes : ça existe des variable à 3 bytes (un unsigned long c'est 4, non ?) ?
    1 byte n'est pas toujours égal à 8 bits... cela dépend de l'architecture matérielle.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  18. #18
    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 Emcy
    on a pas le droit d'ecrire un truc dans le genre ?
    typedef struct _StructVLAN
    {
    unsigned char Enb[3]:1; //bool 1 ou 0
    unsigned char ID[3]:12; // chiffre écrit en ASCII entre 0 et 4095
    unsigned char Priority[3]:1; //bool 1 ou 0
    unsigned char Member[3]:5; // chiffre écrit en ASCII sur 5bits
    unsigned char Tagged[3]:5; // chiffre écrit en ASCII sur 5bits

    } StructVLAN;
    Je ne crois pas; par contre, on peut utiliser la solution de ronan99999 qui utilise l'idée des champs de bits.

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    j'ai fait n'importe quoi regardez j'ai fait des modif est-ce que vous comprennez mieux maintenant ?

  20. #20
    Membre éclairé Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Par défaut
    Le reste des bis n'est pas utilisé.
    Si tu préféres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    typedef struct _StructVLAN
    {
    	unsigned long Enb:1;  //bool 1 ou 0 
    	unsigned long ID:12; // chiffre écrit en ASCII entre 0 et 4095
    	unsigned long Priority:1; //bool 1 ou 0 
    	unsigned long Member:5; // chiffre écrit en ASCII sur 5bits
            unsigned long Tagged:5; // chiffre écrit en ASCII sur 5bits
            unsigned long rfu:8;
     
    } StructVLAN;
     
     
    //Sinon ce n'est pas correcte non plus , il y'a toujours un problémes sur //member et tagged
     
    struct temp {
    	unsigned short Enb:1;  //bool 1 ou 0 
    	unsigned short ID:12; // chiffre écrit en ASCII entre 0 et 4095
    	unsigned short Priority:1; //bool 1 ou 0 
            unsigned short rfu:2;
    };
     
    typedef struct _StructVLAN
    {
     
            struct temp;//sructure anonyme
    	char Member[5]; // chiffre écrit en ASCII sur 5 bytes
            char Tagged[5]; // chiffre écrit en ASCII sur 5 bytes
     
    } StructVLAN;

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

Discussions similaires

  1. définition de structure dans le main
    Par gbsatti dans le forum Débuter
    Réponses: 10
    Dernier message: 02/12/2010, 19h15
  2. Définition de structure
    Par gbsatti dans le forum Débuter
    Réponses: 2
    Dernier message: 26/11/2010, 23h22
  3. définition de structures complémentaire
    Par zuymanto dans le forum Débuter
    Réponses: 2
    Dernier message: 31/03/2010, 00h34
  4. déclaration et définition de structures
    Par dgkourou dans le forum C++
    Réponses: 2
    Dernier message: 07/02/2008, 10h45
  5. Problème de définition de structure
    Par jean-poil dans le forum C
    Réponses: 3
    Dernier message: 12/11/2007, 12h34

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