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 de taille dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Par défaut Structure de taille dynamique
    Bonjour,
    pour le développement d'un module pour le noyau linux sur ARM, pour la lecture "brute" d'un zone de mémoire flash,
    j'ai un buffer non pas en char* mais d'une structure représenant la forme des données en mémoire flash.

    Voici ma structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct 
    {
      //métadonnées
      uint8_t id;
      ...
      uint32_t klen;
      uint32_t vlen;
     
      //données
      uint8_t data[1];
    }page;
    Comme la taille de la page n'est pas connue statiquement, et elle peut varier voici comment je l'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    page *mon_buffer=vmalloc( page_length );
    read_flash(mon_buffer, page_length)
    Ainsi je n'ai pas besoin de spécifier une par une les métadonnées et je peux accéder directement au donnée utiles via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_buffer->data+offset_data
    .

    Cela est-il corrècte ? peut il y a avoir un cas qui mettrais en défaut ce choix de mise en oeuvre (si oui lequel ?) ?
    Et au sens plus "conventionel" cela pose t-il un probleme de "violation" des conventions ... ?

    Merci

  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
    L'important, c'est comment du détermines l'allocation.

    Normalement, tu es censé définir la taille comme offsetof(page, data) + taille_des_data.
    offsetof étant défini dans <stddef.h>.
    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é
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La construction prévue par le standard ne serait-elle pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct 
    {
      //métadonnées
      uint8_t id;
      ...
      uint32_t klen;
      uint32_t vlen;
     
      //données
      uint8_t data[];   // sans préciser la dimension
    }page;

  4. #4
    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
    Sur les compilos assez récent pour le supporter.

    La seule différence, c'est le résultat d'un sizeof(page), il me semble. Dans tous les cas ça fait ce qu'il faut pour éviter les problèmes d'alignement.
    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.

  5. #5
    Membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Par défaut
    Salut,
    merci de vos réponses,
    j'ai changé le
    en
    @Médinoc:
    J'utilise la structure comme une représentation "brute" des données en mémoire flash (pour la lecture et l'écriture, ce qui évite pas mal de casts et pas mal d'erreurs), sur la machien de test, chaque page fait 2048 octets (mais peut changer selon l'architecture).
    Les métadonnées ayant une taille constante de 16 octets (en contant les "bouches trous" de l'alignement) donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    offsetof(page, data) + taille_des_data =  page_length
    Donc normalement en faisant ça, je respecte les standards ?

  6. #6
    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
    Ça a l'air, tant que les contraintes d'alignement de la structure sont précisées correctement pour bien correspondre à ce que tu lis (et il n'y a rien dans le standard pour cela, ça dépend du compilateur).
    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.

Discussions similaires

  1. requete à 2 dimensions / structure de table dynamique
    Par fourchette dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/08/2006, 10h02
  2. Comment créer une structure de donnée dynamiquement ?
    Par Beaunico dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 09h34
  3. taille dynamique des cases dans état
    Par exter666 dans le forum Access
    Réponses: 14
    Dernier message: 09/09/2005, 15h30
  4. [SQL] Structure de table dynamique
    Par litbos dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 02/09/2005, 15h49
  5. [JTABLE] taille dynamique = F°(String.length)
    Par tripop dans le forum Composants
    Réponses: 15
    Dernier message: 13/01/2005, 17h07

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