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éclarer des variables inférieures à 8 bits


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut Déclarer des variables inférieures à 8 bits
    Bonjour,
    je dois implémenter (enfin essayer) un protocole donc pour commencer, je crée une structure qui représente donc le protocole en lui-même... Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct ip6_mh_opt_fid {
    	uint8_t 	ip6mofid_type;
    	uint8_t 	ip6mofid_len;
    	uint16_t	ip6mofid_flags;
    	uint8_t 	ip6mofid_PRI;
    	uint8_t		FID;
    }
    Donc lorsque mes champs du protocole sont mutiples de 8, ça me pose pas de problème.
    Le souci vient que j'ai des champs qui sont donc non multiples... je ne sais pas trop comment gérer ça. Je crois pas que les champs de bits soient la bonne solution car en parcourant un peu dans le noyau Linux, j'en ai pas croisé pour implémenter des protocoles. J'ai l'impression que les gaillards s'arrangent toujours pour avoir un nombre multiple de 8... alors bon, je vois un petit peu un début de solution, en regroupant par exemple plusieurs champs pour avoir un multiple de 8. Oui mais bon, je fais comment pour bien affecter le tout et retrouver mes petits? les opérateurs bits à bits peuvent m'aider.
    Mais je vois toujours pas comment je me débrouille dans un cas par exemple ou j'ai un champ qui fait 6 bits, que je regroupe avec deux autres de 1 bit pour faire un multiple de 8 pour ensuite affecter, puis lire ces champs...

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Il existe des directives pour l'alignement genre push_bask/push_pop je crois pas sûr qu'on puisse préciser par contre que se soit un multiple de 8.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Les champs sont en effet toujours regrouppés par un multiple de 9 dans les protocoles, ainsi un champ n'est jamais (ou pratiquement jamais) "coupé" en deux sur deux octets/mots etc.

    Les accès se font généralement par masques de bits (opérateurs bit-à-bit | et &) et décalage (opérateurs de décalage << et >>)
    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.

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Ok merci, ça me conforte dans ce que je pensais.
    Je vais donc tenter le tout à coup de masque de bits et de décallage tout seul comme un grand, je reviendrai par la suite en cas de problème.

    Merci pour votre concision et votre rapidité.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Points : 66
    Points
    66
    Par défaut
    Ben la plus petite unité adressable en mémoire c'est l'octet. Tu ne peux en declarer que des multiples.

    Par contre je crois que tu te compliques trop la vie si tu as besoin de 6bits pourquoi ne pas utilisé une variable de 8bits ? tu manques a ce point de mémoire ?

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par the_ionic
    je dois implémenter (enfin essayer) un protocole donc pour commencer, je crée une structure qui représente donc le protocole en lui-même... Par exemple:
    Il n'y a aucune garantie que ce code soit portable. En effet, dans une structure C, les éléments peuvent être séparés par des bytes de bourrage (padding) qui servent à respecter certaines contraintes d'alignement dépendant de l'architecture matérielle. Et je ne parle pas des problèmes d'endianness...

    On peu parfois, au prix de directives non standard (PACKED et autres) forcer un alignement à 8 bits, mais
    • ce n'est pas portable
    • ca génère du code en plus.

    En définitive, il faut oublier le principe de réaliser des interfaces externes avec les structures.

    Par contre, il est possible d'utiliser un tableau de unsigned char dans lequel on met exactement ce qu'on veut où on veut avec éventuellement les opérateurs binaires (&, |, >>, << etc.).

    Il suffit d'un définition claire de la structure de l'interface de données.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par disturbedID
    Ben la plus petite unité adressable en mémoire c'est l'octet.
    Ca commence mal. C'est le byte et il fait au-moins 8 bits en C. Je connais des architectures où le byte fait 16 bits (TMS320C54) et d'autres où il fait 32 bits (MC56156).
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Il n'y a aucune garantie que ce code soit portable. En effet, dans une structure C, les éléments peuvent être séparés par des bytes de bourrage (padding) qui servent à respecter certaines contraintes d'alignement dépendant de l'architecture matérielle. Et je ne parle pas des problèmes d'endianness...

    On peu parfois, au prix de directives non standard (PACKED et autres) forcer un alignement à 8 bits, mais
    • ce n'est pas portable
    • ca génère du code en plus.
    Salut, tout d'abord, merci pour ta réponse qui comme d'habitude est plus que judicieuse :-) Bon, arrêtons là le cirage de pompes mais c'est vrai que c'est pas la première fois que tu m'aides bien!

    Bon alors effectivement, vu que je suis en train de coder une extension d'un protocole, j'ai quelques exemples de structure et j'ai vu la directive packed. Je vais donc l'utiliser, malgrè que je sache que mon code ne sera pas portable...

    Je comprends qu'un tableau d'unsigned char me permette de faire ce que je veux mais j'aimerai garder une certaine unité avec ce qui a été développé avant et je ne suis pas un spécialiste mais il me semble qu'on utilise des structures dans le noyau lorsqu'on veut représenter un paquet d'un protocole non (genre ipv6 etc...)?

Discussions similaires

  1. Faut il déclarer des variables ?
    Par hugo69 dans le forum Langage
    Réponses: 16
    Dernier message: 01/07/2008, 12h08
  2. Déclarer des variables globales
    Par Jinx_ dans le forum Débuter
    Réponses: 11
    Dernier message: 15/02/2008, 13h07
  3. [Debutant]Comment déclarer des variables dans un fichier a part
    Par megapacman dans le forum Général Java
    Réponses: 14
    Dernier message: 14/01/2008, 13h32
  4. [Débutant] Comment déclarer des variables et un vecteur ?
    Par valanscu77 dans le forum Assembleur
    Réponses: 4
    Dernier message: 27/03/2007, 18h25
  5. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 12h50

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