web-dev-qa-db-fra.com

Définir un tableau en C

J'ai plusieurs tableaux de 450 éléments (stockant des données bitmap à afficher sur des écrans lcd.) Je voudrais les mettre sous un fichier d'en-tête et #define eux, mais je reçois toujours des erreurs de compilation. Comment pourrais-je faire cela dans C ?

#define numbers[450] {0, 1,etc...}

#define numbers {0, 1, etc...}

#define numbers[450] puis définissez les chiffres plus tard

et beaucoup plus...

9
Reid

Eh bien ... vous n'avez certainement pas besoin d'utiliser de définition. Ajoutez-les simplement dans l'en-tête en tant que const, tableaux statiques.

/* prevents multiple, redundant includes */
/* make sure to use a symbol that is fairly sure to be unique */
#ifndef TEST_H
#define TEST_H

/* your image data */
const char image[] = { 1, 2, 3, 4, ... };

#endif

De plus, si vous souhaitez obtenir de l'aide sur une erreur de compilation, vous devez publier votre code.

10
Ed S.

Parce que vous affichez sur un écran LCD, je suppose que c'est un système embarqué.

Ne mettez pas les données dans un en-tête.

Placez les données dans un fichier C ou C++ ordinaire. Compilez ceci. Il peut ne contenir que les données, ce qui est correct, et facilite la mise à jour.

Utilisez ensuite le fichier d'en-tête pour donner accès aux données.

Par exemple, dans un fichier images.c:

#include "images.h"
const byte numbers1[MAX_NUMBERS1] = { ... };
byte numbers2[MAX_NUMBERS2];       // will be initialsied to 0

Alors images.h est:

#ifndef _IMAGES_H_
#define _IMAGES_H_

typedef unsigned char byte;
#define MAX_NUMBERS1 (450)
        // different constants in case you change something        
#define MAX_NUMBERS2 (450)      
       // even better if you can do const static int MAX_NUMBERS1=450; 
       // but depends on the compiler
extern const byte numbers1[MAX_NUMBERS1] = { ... };
extern byte numbers2[MAX_NUMBERS2];       // will be initialised to 0

#endif

Tous les autres fichiers .c du programme peuvent alors y accéder.

C'est (presque) toujours une mauvaise idée de mettre un définition d'un variable dans un fichier d'en-tête.

A déclaration d'une variable, par exemple. extern byte numbers2[MAX_NUMBERS2]; indique au compilateur C qu'il existe une variable de tableau appelée numbers2 ailleurs dans le programme final lié. Si l'éditeur de liens n'obtient pas cette définition (d'ailleurs), il générera une erreur car il n'y a pas d'espace pour la variable allouée.

A définition d'une variable (notez no extern), par exemple. byte numbers2[MAX_NUMBERS2]; indique effectivement au compilateur C qu'il existe une variable de tableau appelée numbers2 et il doit allouer l'espace ici, dans le code objet résultant de ce fichier source, et celui-ci sera utilisé pour conserver la valeur de la variable dans le programme lié final.

L'espace pour numbers2 n'est pas alloué par le compilateur C quand il voit une déclaration (précédé de extern), il est alloué quand il voit le définition réelle (pas de extern).

Ainsi, si vous placez la définition réelle d'une variable dans un fichier d'en-tête et l'incluez dans plusieurs fichiers de code source (.c), le compilateur C allouera plus d'une fois de l'espace pour la variable. L'éditeur de liens donnera alors une erreur (généralement plusieurs définitions du même nom).

Il y a un problème plus subtil. Si, lors du premier développement du programme, le fichier d'en-tête n'est inclus que dans un seul fichier source, le programme se compilera et se liera correctement. Ensuite, à une date ultérieure, si un deuxième fichier source inclut l'en-tête (peut-être que quelqu'un vient de diviser le fichier de code source d'origine en deux fichiers), l'éditeur de liens soulèvera une erreur de "définitions multiples". Cela peut être très déroutant car le programme utilisé pour compiler et lier, et apparemment rien n'a changé.

Résumé
Ne jamais allouer d'espace pour une variable en mettant une définition dans un fichier d'en-tête. Mettez uniquement la variable déclarations dans les fichiers d'en-tête.

8
gbulmer

J'ai eu un problème similaire. Dans mon cas, j'avais besoin d'un tableau de constantes pour pouvoir utiliser comme taille d'autres tableaux statiques. Quand j'ai essayé d'utiliser le

const int my_const_array[size] = {1, 2, 3, ... };

puis déclarer:

int my_static_array[my_const_array[0]];

Je reçois une erreur de mon compilateur:

array bound is not an integer constant

Donc, j'ai finalement fait ce qui suit (peut-être qu'il existe des façons plus élégantes de le faire):

#define element(n,d) ==(n) ? d :
#define my_const_array(i) (i) element(0,1) (i) element(1,2) (i) element(2,5) 0
1
Ojos