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 :

Initialiser une structure contenant un tableau


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut Initialiser une structure contenant un tableau
    Bonjour,

    je suis en développement partagé pour un projet, et nous utilisons une structure globale dans l'archi de notre projet. Je ne peux donc qu'enrichir cette structure. Voici la structure à la base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct vuhfw_internal_data
    {
        struct vuhfw_active_logical_command active_logical_cmd; /* Active logical command */
        enum DM_COMMON_VUHF_COM_MODE_NW     last_stdby_mode_nw; /* TODO: en attente de passage du QoS de stdby NW à CTL */
        enum DM_COMMON_VUHF_COM_MODE_W      last_active_mode_w; /* Last active mode w */
        enum DM_VUHFW_PRESET_MODE           last_active_preset_submode; /* Last preset_submode */
        enum DM_VUHFW_COMSEC_TYPE           last_comsec_data_secure_selection; /* Last comsec data secure selection */
        BOOL                                vuhfw_init_in_progress; /* Manage the initialization phase of the vuhf */
        struct vuhfw_internal_data_radio_status radio_status;   /* CBIT data */
        UINT8                               hq_wod_erase_retry_counter ; /* Retry counter for HQ WOD erase command */
       etc.....
    Pour le moment tout va bien, on instancie cette structure à l'init et on la remplit:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    static const struct vuhfw_internal_data vuhfw_internal_data_init_values =
    {
        /* .active_logical_cmd */
        {
            /* .timer_id */ 0,
            /* .index    */ 0,
            /* .step     */ 0,
            /* .status   */ vuhfw_LOGICAL_CMD_STATUS_NONE
        },
        /* last stdby mode nw */
        DM_COMMON_VUHF_COM_MODE_NW_FF,
        /* last active mode w */
        DM_COMMON_VUHF_COM_MODE_W_FF,
        /* last preset_submode */
        DM_VUHFW_PRESET_MODE_FF,
        /* last comsec data secure selection */
        DM_VUHFW_COMSEC_TYPE_PLAIN,
        /* .vuhfw_init_in_progress */
        FALSE,
        /* CBIT data */
        {
            /*. test_number */                      0,
            /* .lna_fault*/                         FALSE,
            /* .hpa_fault*/                         FALSE,
     
            /*. prev_test_number */                 0,
            /* .prev_lna_fault*/                    FALSE,
            /* .prev_hpa_fault*/                    FALSE,
     
            /*. test_number_timer_id */             0,
            /* .lna_fault_timer_id*/                0,
            /* .hpa_fault_timer_id*/                0,
            /* .late_net_entry_timer_id*/           0,
     
            /* .test_number_timer_is_activated */   FALSE,
            /* .lna_fault_timer_is_activated */     FALSE,
            /* .hpa_fault_timer_is_activated */     FALSE,
            /* .late_net_entry_timer_is_activated */FALSE,
     
            /* .alarm_status */                     FALSE
        },
        /* .hq_wod_erase_retry_counter */
        0U,
       etc .....

    Bon. Il s'avère que je ne connais pas trop ce système d'init entière de la structure mais je dois m'y conforter. Le problème est que je rajoute ceci à la déclaration de ma structure:

    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
     
    #define VUHFW_INTERNAL_DATA_MAX_GROUP_DATA_SIZE         97
    #define VUHFW_INTERNAL_DATA_MAX_AFP_BLOCKS              128
     
    /* AFP file groups */
    struct vuhfw_internal_data_afp_blocks
    {
        UINT8       length ;
        CHAR        block[VUHFW_INTERNAL_DATA_MAX_GROUP_DATA_SIZE];
    };
     
    struct vuhfw_internal_data
    {
        struct vuhfw_active_logical_command active_logical_cmd; /* Active logical command */
         .......... 
         /* J'ajoute ça : */
        struct vuhfw_internal_data_afp_blocks vuhfw_afp_block[VUHFW_INTERNAL_DATA_MAX_AFP_BLOCKS]; /* Manage AFP blocks parsed from an AFP file */
    };
    C'est donc un tableau de structure, ces structures contenant elle meme une taille (length) et un autre tableau (block).

    Ma question: vue la taille des données, comment initialiser entièrement ce tableau de structures à 0 par exemple, en gardant la déclaration antérieure. Pour le moment j'ai fait ç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
     
    static const struct vuhfw_internal_data vuhfw_internal_data_init_values =
    {
        /* .active_logical_cmd */
        {
            /* .timer_id */ 0,
            /* .index    */ 0,
            /* .step     */ 0,
            /* .status   */ vuhfw_LOGICAL_CMD_STATUS_NONE
        },
       etc .....
     
        /* J'ajoute ça à la fin de mon init: */
        { { 0 } }
    Question1 : Est-ce que tout mon tableau de structures sera initialisé à zero ?
    Question2: Est-ce que ca me garantit aucun décalage dans le futur, c'est a dire que si quelqu'un d'autre rajoute un entier derrière ma déclaration, et l'initialise comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    { { 0 } } ,
    /* Init de son entier : */
    8
    Ca va fonctionner, il y aura bien 8 dans son entier (aucun décalage) ???

    Merci pour l'aide !!!

  2. #2
    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
    Si on initialise un membre d'une structure ou un élément d'un tableau, les membres ou éléments non explicitement initialisés sont initialisés suivant les règles applicables à l'initialisation par défaut des objets static :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Initialisation par défaut des objets static :
    Si l'objet est 
      - un pointeur, il est initialisé à NULL
      - d'un type arithmétique, il est initialisé à 0
      - si c'est un tableau ou une structure, les éléments ou les membres sont initialisés par défaut (comme des objets static).
      - si c'est une union, le premier membre est initialisé par défaut (comme un objet static).
    Dans ton cas, tu initialise un tableau de structures par {{0}}.
    Le premier élément du tableau (une structure) est initialisé par {0}. Ceci initialise le premier membre de cette structure à 0. L'autre élément de cette structure, non initialisé explicitement, sera initialisé par les règles ci-dessus. C'est un tableau de char, donc tous les éléments de ce tableau seront mis à 0 (indépendamment du fait que tu as mis 0 dans {{0}}).
    Les autres éléments du tableau de structures, non initialisés explicitement, seront initialisés suivant les règles ci-dessus : le premier membre, un entier, sera mis à 0 et les éléments du tableau de char seront mis à 0.

    Au final, tu as des 0 partout sauf (peut-être) pour le premier membre de la première stucture du tableau où tu as l'unique valeur que tu as mise dans ton initialiseur.

    Ca va fonctionner, il y aura bien 8 dans son entier (aucun décalage) ???
    oui

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Diogene,

    merci pour cette réponse très utile.

    Du coup je me pose cette question:
    j'avais mis { { 0 } } en me disant que comme ça j'assurai le fait de n'avoir aucun décalage par la suite. Mais au fond, puisque tout est initialisé par défaut à 0, mon init de mon premier champ à 0 est absolument superflu ? Dans ce cas mettre { { 0 } } est-il utile quand meme ? Sinon comment passer dans la règle générale "j'initialise tout par défaut" tout en garantissant le fait de ne pas avoir de décalage pour ceux qui ajoutent des éléments initialisés par la suite ?

    Merci encore pour l'aide.

  4. #4
    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
    Je pense que c'est obligatoire sauf peut-être si toutes les autres initialisations utilise le nommage des champs dans la liste d'initialisation. Mais c'est une caractéristique C99.
    De toute façon, je crois préférable d'initialiser explicitement ne serait-ce que pour des raisons de clarté et d'homogenéité d'écriture du code.

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Tu as raison, j'ai modifié mon code pour finalement initialiser explicitement ma structure avec des 0.

    Encore merci pour ton aide.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/01/2015, 23h57
  2. probleme avec une structure contenant un tableau
    Par bringer dans le forum Débuter
    Réponses: 8
    Dernier message: 31/05/2010, 16h18
  3. initialiser une structure
    Par marbouchi dans le forum Débuter
    Réponses: 10
    Dernier message: 10/12/2008, 18h51
  4. Réponses: 2
    Dernier message: 27/05/2008, 09h56
  5. Réponses: 11
    Dernier message: 14/07/2007, 18h44

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