Définir un tableau en C

Définir un tableau en C

Eh bien... vous n'avez certainement pas besoin d'utiliser une 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

Aussi, si vous voulez de l'aide sur une erreur de compilation, vous devriez poster votre code.


Étant donné que vous affichez sur un écran LCD, je suppose qu'il s'agit d'un système intégré.

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 n'est pas grave 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

Ensuite, tous les autres fichiers .c du programme peuvent y accéder.

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

Une déclaration d'une variable, par exemple extern byte numbers2[MAX_NUMBERS2]; indique au compilateur C qu'il existe une variable 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ère une erreur car il n'y a pas d'espace pour la variable allouée.

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

L'espace pour numbers2 n'est pas alloué par le compilateur C lorsqu'il voit une déclaration (précédée de extern ), il est alloué lorsqu'il voit la 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 que vous l'incluez dans plusieurs fichiers de code source (.c), le compilateur C allouera de l'espace pour la variable plus d'une fois. Ensuite, l'éditeur de liens donnera 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 générera une erreur "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. Ne mettre que des déclarations variables dans les fichiers d'en-tête.