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 :

Initialisation de structures const


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par défaut Initialisation de structures const
    Bien le bonjour à toi qui veut bien lire mon message.

    Voici le problème que j'ai. Je code sur micro-controleur, donc je n'ai pas beaucoup de place en RAM.
    J'aimerais donc déclarer un tableau fixe de structures fixes pour de la génération d'icônes sur un écran.
    Une icône est définie en format .xbm ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #define key1_width 32
    #define key1_height 11
    static unsigned char key1_bits[] = {
       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00, 0x20, 0x08,
       0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x5c, 0x74,
       0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x20, 0x08,
       0x00, 0x00, 0x10, 0x11, 0x00, 0x00, 0x00, 0x01 };
    Un bitmap est de la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    static const lcd_bitmap_t key1 = 
    {
      key1_width, 
      key1_height, 
      key1_bits
    };
    Une animation est définie sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static const anim_frame_t test = 
    {
      key1, {0,0}, false, TICKS_MS(500)
    };
    Et mon tableau d'animation de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const anim_animation_t tabs_animations[] =
    {
      {false,TICKS_S(5),1,&test,45},
      {false,TICKS_S(5),1,NULL,45}
    };
    Et voilà ce qu'il me sort comme erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    module_screen.c:23: error: initializer element is not constant  
    module_screen.c:23: error: (near initialization for 'test.bitmap')
    La ligne c23 est la ligne de déclaration de test...

    Qu'est-ce qui se passe-t-il donc ?

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par défaut
    J'avais oublié de donner les types de mes structures...
    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
     
    typedef struct screen_bitmap {
        screen_pos_t sizex;
        screen_pos_t sizey;
        const uint32_t* data;
    } screen_bitmap_t;
     
    typedef uint32_t timestamp_delta_t;
     
    typedef struct anim_frame {
    //	const screen_bitmap_t * bitmap;
    	const lcd_bitmap_t bitmap;
    	screen_coord_t pos;
    	screen_boolean_operation_t operation;
    	timestamp_delta_t time;
    } anim_frame_t;
     
    typedef struct anim_animation {
    	bool looping;
    	timestamp_delta_t duration;
    	uint16_t nframes;
    	const anim_frame_t* frames;
    	screen_pos_t extent;
    } anim_animation_t;
    Merci encore

  3. #3
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut
    Bonjour !

    J'ai fait quelques tests et j'ai surement trouver quelque chose...

    J'ai repris le nom de ta structure et j ai mis deux entier a la place pour faciliter les tests


    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
    typedef struct anim_frame {
    	int foo;
    	int bar;
    } anim_frame_t;
     
     
    int main(void) {	
     
    	static const anim_frame_t test = 
    	{
    	  42, 8
    	};
     
     
    	return 0;
    }
    Ce code compile, car 42 et 8 sont des constantes (j'aurai pu les definir const int mon_nombre = 42). Comme ta structure test est déclare en tant que const, il n'y a pas de problemes, son contenu ne pouvant pas changer...


    mais si je met des variables dans la structures const...

    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
    typedef struct anim_frame {
    	int foo;
    	int bar;
    } anim_frame_t;
     
     
    int main(void) {	
     
    	int myvar = 42;
     
    	static const anim_frame_t test = 
    	{
    	  myvar, 8
    	};
     
     
    	return 0;
    }
    j ai la meme erreur que celle que tu as donné

    test.c: In function `main':
    test.c:16: error: initializer element is not constant
    test.c:16: error: (near initialization for `test.foo')

    logique, ta structure est une constantes et là son contenu est variable... tu devrai chercher par là... ce que je ne comprend pas c'est que tu as déclare bitmap en tant que constante aussi...

    const lcd_bitmap_t bitmap

    et qu'il le prend donc pour une variable... peut etre que c'est dû a d'autres membres de la structure qui ne serai pas constant ?

  4. #4
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    une constante est toujours initialisé à sa déclaration. Tu ne peut pas changer les valeurs ensuite et si tu doit le faire alors sa ne doit pas être une constante.

    attention aussi à sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static const struct
    {
    int a;
    int b;
    };
    si tu veut changer une valeur a mon avis sa serai plus simple de voir les choses comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static struct
    {
    const int a;
    int b;
    };
    dans ce cas a est constant et b ne l'ai pas. tu pourra changer b.

Discussions similaires

  1. initialiser les structures de données
    Par farid0031 dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/06/2009, 20h43
  2. [Débutant] Initialisation de structure, matrice de structure
    Par huguette dans le forum MATLAB
    Réponses: 3
    Dernier message: 13/03/2009, 19h35
  3. initialiser une structure
    Par marbouchi dans le forum Débuter
    Réponses: 10
    Dernier message: 10/12/2008, 18h51
  4. Réponses: 4
    Dernier message: 06/03/2008, 11h57
  5. Initialisation de Structure
    Par Kemanke dans le forum C++
    Réponses: 17
    Dernier message: 06/09/2007, 18h57

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