Se si sta visualizzando su un LCD, presumo che si tratti di un sistema incorporato.
Non inserire i dati in un'intestazione.
Inserire i dati in un file C o C++ ordinario. Compila questo. Potrebbe contenere solo i dati, va bene e facilita l'aggiornamento.
Quindi utilizzare il file di intestazione per consentire l'accesso ai dati.
Ad esempio, in un file images.c:
#include "images.h"
const byte numbers1[MAX_NUMBERS1] = { ... };
byte numbers2[MAX_NUMBERS2]; // will be initialsied to 0
L'l'images.h è:
#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
Poi tutti gli altri file .c nel programma può accedervi.
E '(quasi) sempre una cattiva idea di mettere una definizione di una variabile in un file di intestazione.
A dichiarazione di una variabile, ad es. sta dicendo al compilatore C che esiste una variabile di matrice chiamata numbers2
altrove nel programma nel programma finale collegato. Se il linker non ottiene quella definizione (da qualche altra parte), genera un errore perché non c'è spazio per la variabile allocata.
Una definizione di una variabile (avviso non esterno), ad es. byte numbers2[MAX_NUMBERS2];
sta dicendo al compilatore C che esiste una variabile di matrice chiamata numbers2
e dovrebbe allocare qui lo spazio, nel codice oggetto risultante da questo file sorgente, e questo verrà usato per mantenere il valore della variabile nel finale , programma collegato.
Lo spazio per numbers2
è non assegnato dal compilatore C quando vede una dichiarazione (preceduto da extern
), essa è allocata quando vede la definizione stessa (senza extern
).
Quindi, se si inserisce la definizione effettiva di qualsiasi variabile in un file di intestazione e la si include in più di un file di codice sorgente (.c), il compilatore C allocerà spazio per la variabile più di una volta. Quindi il linker darà un errore (di solito più definizioni con lo stesso nome).
C'è un problema più sottile. Se, al primo sviluppo del programma, il file di intestazione è incluso solo in un file sorgente, il programma verrà compilato e collegato correttamente. Quindi, in un secondo momento, se un secondo file sorgente include l'intestazione (forse qualcuno ha appena diviso il file del codice sorgente originale in due file), il linker genererà un errore di "definizioni multiple". Questo può essere molto confuso perché il programma utilizzato per compilare e collegare, e apparentemente nulla è cambiato.
Sommario
Mai allocare lo spazio per una variabile mettendo una definizionein un file di intestazione. Metti solo dichiarazioni variabili nei file di intestazione.
Perché non si p ost il codice che hai finora e quali errori del compilatore stai ottenendo? –
Non puoi '# define' qualcosa del genere. Pensaci; ogni volta che lo utilizzi dichiareresti un nuovo array. Ovviamente ciò porterà a ridefinizioni multiple. Le macro sono semplicemente sostituzioni di testo. Sostituisci il testo da solo e verifica se ha senso. –