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

Linux Discussion :

[Linux]problème d'affectation d'une structure


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    ingénieur R&D
    Inscrit en
    Avril 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : ingénieur R&D

    Informations forums :
    Inscription : Avril 2005
    Messages : 15
    Points : 17
    Points
    17
    Par défaut [Linux]problème d'affectation d'une structure
    Bonjour à tous...
    Je suis en train d'écrire un décodeur de table sdt (api dvb), mais j'ai un souci lors de l'affectation de ma structure...
    En gros, ma structure ressemble à ça :
    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
    typedef struct {
        u_char    table_id            : 8;
        u_char    section_syntax_indicator    : 1;
        u_char                    : 3;
        u_char    section_length_hi        : 4;
        u_char    section_length_lo        : 8;
        u_char    transport_stream_id_hi        : 8;
        u_char    transport_stream_id_lo        : 8;
        u_char                    : 2;
        u_char    version_number            : 5;
        u_char    current_next_indicator        : 1;
        u_char    section_number            : 8;
        u_char    last_section_number        : 8;
        u_char    original_network_id_hi        : 8;
        u_char    original_network_id_lo        : 8;
        u_char                    : 8;
    } sdt_t;
    Et, lorsque je la créé, je l'affecte au passage avec ce que j'ai dans un buffer (char * buf)... (lecture directe dans le demuxer, ce que j'ai dans mon buffer correspond à ce que j'attend).
    création/affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sdt_t enteteSDT = {buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]};
    Seulement voila... Tout se passe bien (compil, linkage et tout), mais mon buf[1] ne passe pas...
    En gros, buf[0] est bien mis dans table_id, buf[1] disparait, et mon 1er octet de buf[2] se retrouve dans section_syntax_indicator...
    Je suis obligé d'affecter ma structure en envoyant 2 fois buf[1], mais je ne vois pas pourquoi...
    Pour info, buf[1] contient "f2" (en hexa), et il ne me semble pas que ça soit une valeur spéciale (genre \r, \n ou autre).
    Je ne vois vraiment pas pourquoi mon buf[1] n'est pas pris en compte lors de mon affectation...
    Si vous avez des idées !!!!
    Merci

  2. #2
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Salut,

    Je suis un peu décontenançé par le fait que tu indiques dans ta struct à la fois le type de tes champs, et leur taille en bits.

    De même je m'étonne des lignes :
    Où tu ne précises que le type et la taille.

    Je serais plutot habitué à quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct {
        table_id                          : 8;
        section_syntax_indicator    : 1;
        riendutout                       : 3;
        section_length_hi               : 4;
    ...
    }
    enfin, je dis ça de tête

  3. #3
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    J'étais persuadé que seuls les types int, unsigned int et signed int étaient acceptés pour les champs de bits. Mais je suis loin d'être un spécialiste...

    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++

    +

  4. #4
    Membre à l'essai
    Profil pro
    ingénieur R&D
    Inscrit en
    Avril 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : ingénieur R&D

    Informations forums :
    Inscription : Avril 2005
    Messages : 15
    Points : 17
    Points
    17
    Par défaut
    Merci bien pour vos messages, je vais testé ça (le coup de ne pas mettre de type)...
    En fait, ce n'est pas moi qui est écrit la structure comme ça, je l'ai récupéré dans les sources d'un set top box...
    Enfin bon, je vous tiens au courant de ce que ça donne sans type !

  5. #5
    Membre à l'essai
    Profil pro
    ingénieur R&D
    Inscrit en
    Avril 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : ingénieur R&D

    Informations forums :
    Inscription : Avril 2005
    Messages : 15
    Points : 17
    Points
    17
    Par défaut
    donc, j'ai fait l'essai en en mettant pas de type...
    Du coup, ça ne passe plus la compil...
    Et si j'essaie avec des u_int, ça me donne le meme résultat qu'avec des u_char...
    Je viens de faire d'autre tests au niveau de l'affichage, pour voir ce que contiennent mes différents champs et il semble qu'il n'affecte pas octets par octets comme je le pensais, mais champs par champs....
    Ce qui signifie que table_id contient bien buf[0], section_syntax_indicator contient le premier bit de buf[0] (en gros buf[0][0] en bit), le champ vide (qui s'appelle reserved1 maintenant) contient les 3 premiers bits de buf[2], etc...
    Or moi, ce que je n'est pas exactement ce que je voudrais...
    Je souhaiterais que, au final, table_id = buf[0], (section_syntax_indicator<<7)|(dummy<<6)|(reserved1<<4)|section_length_hi = buf[0].
    Voyez vous une solutions simple pour y arriver ? ou faudra t'il que j'y aille au bit par bit, comme ce que j'ai voulu éviter jusqu'à maintenant ?

  6. #6
    Membre à l'essai
    Profil pro
    ingénieur R&D
    Inscrit en
    Avril 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : ingénieur R&D

    Informations forums :
    Inscription : Avril 2005
    Messages : 15
    Points : 17
    Points
    17
    Par défaut
    Bon, j'ai réussi a remplir ma structure correctement, et assez simplement....
    la solution que j'ai trouvé est de passer par un tableau de u_char, de taille fixe...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	u_char temp[8] = {buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]};
    	pat_t &entetePat = *(pat_t*)temp;
    Ici, c'est pour la table pat, mais le principe est le meme pour la table sdt, avec un tableau de taille 11....
    Merci à tous !!!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/09/2010, 09h30
  2. Réponses: 5
    Dernier message: 06/10/2007, 11h33
  3. Réponses: 17
    Dernier message: 09/03/2007, 18h13
  4. Réponses: 3
    Dernier message: 04/04/2006, 09h39
  5. Entier 64 bits sous linux, problème d'affectation
    Par Steki-kun dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 21h10

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