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 :

Structure et union


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Structure et union
    Bonjour tout le monde
    je veux déclarer une structure censée représenter un télégramme radio. Ce télégramme est supposé contenir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct Telegramme
    {
      uint8_t   u8choice;             //identifiant
      uint8_t   u8Header;            
      uint8_t   u8Data[];             //données applicatives
      uint32_t  u32SenderId;        // ID
      uint8_t   u8Status;             //statut
      uint8_t   u8Chk;                 //Checksum
    };
    le datagramme doit avoir cet ordre bien précis. Le problème je ne connais pas la taille des données applicatives avant exécution car elle dépend justement du u8Header.Le header est censé définir la longueur du champ u8Data[].Disons que suivant le type du télégramme le tableau u8Data[] peut inclure 1, 2 ou 3 de ces variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    uint32_t  u32RLC   // 4 byte
    uint32_t  u32RND   // 4 byte
    uint32_t  u32CMAC  // 4 byte
    Ne faites pas attention aux noms des variables (c'est des notions souvent utilisés en cryptographie) peu importe. je veux que le tableau prenne la taille des variables qui seront incluses suivant les types de telegrammes (si deux variables le tableau aura une taille de 8 bytes si 3 alors 12 bytes) je ne veux pas de buffer non plus avec une taille maximale de 12 bytes pour le worst case.

    J'ai donc pensé à déclarer une structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    struct Telegramme
    {
      uint8_t   u8choice;             //identifiant
      uint8_t   u8Header;            
      uint32_t  u32SenderId;        // ID
      uint8_t   u8Status;             //statut
      uint8_t   u8Chk;                 //Checksum
      uint8_t   u8LengthData;       //Taille des données applicatives    
      uint8_t*   u8Data[];             //données applicatives
     };
    avec un pointeur sur le tableau u8Data[] car sur mon development tool je n'ai pas le droit d'utiliser malloc.donc je me suis dit qu'avec un pointeur sur u8Data[] je pourrais suivant u8LengthData remplir les champs du tableau au cas par cas.
    Une autre contrainte: u8Header est un champ de bits comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct header {
    uint8          u1Prpse:  1;
    uint8          u1PrpseInfo: 1;
    uint8              : 4;                      // unused bits 
    uint8          u1RNDinc: 1;
    uint8          u1CMACinc: 1;
    } ;
    struct header u8Header;
    j'ignore totalement comment "agencer" cette structure Telegramme avec toutes ces contraintes et surtout comment remplir u8Data dans l'application.j'imagine qu'avec une boucle for ca devrait faire l'affaire mais je ne vois pas comment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
       int i;    //counter
       struct Telegramme myTel;     //je déclare une structure de type Telegramme
       for(i=0;i<2;i++)    //prenons le cas u8LengthData est égal à 2 c-à-d les données applicatives font 8 bytes
       {
          myTel.u8Data[i]= 0x11223344;   //comment faire?? est-ce juste?
       }
    Merci merci !!

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par blackhawk94 Voir le message
    Le problème je ne connais pas la taille des données applicatives avant exécution car elle dépend justement du u8Header...
    ...je veux que le tableau prenne la taille des variables qui seront incluses suivant les types de telegrammes (si deux variables le tableau aura une taille de 8 bytes si 3 alors 12 bytes) je ne veux pas de buffer non plus avec une taille maximale de 12 bytes pour le worst case...
    ...car sur mon development tool je n'ai pas le droit d'utiliser malloc...
    Bonjour

    Tes contraintes sont exclusives. Tu ne peux pas créer de truc à taille variable sans faire (au choix)
    • définir un truc avec une taille maximale
    • allouer ton truc via malloc/calloc


    Ce que tu peux faire, c'est donc créer une structure contenant la data (avec taille maximale) et sa taille réelle
    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
    typedef struct {
        uint8_t data[4];
        size_t len;
    } t_u8Data;
     
    typedef struct {
      uint8_t   u8choice;             //identifiant
      uint8_t   u8Header;            
      uint32_t  u32SenderId;        // ID
      uint8_t   u8Status;             //statut
      uint8_t   u8Chk;                 //Checksum
      uint8_t   u8LengthData;       //Taille des données applicatives    
      t_u8Data   u8Data;             //données applicatives
    } t_Telegramme;
     
    int main()
    {
        t_Telegramme telg;
     
        // Ensuite, quand la taille est connue
        assert taille_connue <= 4;
        telg.u8Data.len=taille_connue;
        for (i=0; i < telg.u8Data.len; i++)
            telg.u8Data.data[i]=... // La valeur que tu veux lui mettre
    }
    C'est en fait ce à quoi tu avais pensé dans ta dernière structure (celle avec ton pointeur). Sauf que moi, déjà je supprime ce pointeur. Cela n'aurait d'ailleurs pas marché car au lieu de définir un tableau de uint8, tu définissais un tableau de pointeurs uint8 !!!
    Et comme j'aime bien grouper les choses qui vont ensembles, j'ai associé spécifiquement lengthData avec data...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci Sve@r
    oui tu as raison j'avais créé un tableau de pointeurs bête de a part.Il est vrai que ta solution est beaucoup plus lisible et pratique.Je te remercie beaucoup
    cordialement

Discussions similaires

  1. Structure et Union
    Par Ryu2000 dans le forum Débuter
    Réponses: 2
    Dernier message: 12/02/2013, 11h27
  2. Structure et unions en C
    Par isildur37 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/12/2009, 15h16
  3. structures et unions ?
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 13
    Dernier message: 10/01/2009, 16h02
  4. Structure, union et pointeur
    Par kikoo.plop dans le forum C
    Réponses: 10
    Dernier message: 18/12/2006, 19h21
  5. union de structure syntaxe
    Par al974 dans le forum C
    Réponses: 6
    Dernier message: 29/07/2006, 13h56

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