2012-03-23 7 views
6

Ho diversi array di caratteri di 450 elementi (che memorizzano i dati bitmap da visualizzare sugli schermi LCD). Vorrei inserirli in un file di intestazione e #define, ma continuo a ricevere errori di compilazione. Come farei questo in C?Definisci matrice in C

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

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

#define numbers[450] quindi impostare i numeri dopo

e molti altri ...

+6

Perché non si p ost il codice che hai finora e quali errori del compilatore stai ottenendo? –

+1

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. –

risposta

9

Beh ... di certo non c'è bisogno di utilizzare un definire. Basta aggiungerli nell'intestazione come const, array statici.

/* 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 

Inoltre, se si desidera un aiuto in un errore di compilazione, è necessario inserire il codice.

+0

Sì, ma quando l'intestazione viene chiamata più di una volta (è necessaria in più parti del programma) ottengo errori. – Reid

+2

Quindi usi un [include guard] (http://en.wikipedia.org/wiki/Include_guard) e di nuovo, mostra degli esempi. Non so cosa significhi "chiamare un colpo di testa", ma presumo che tu intenda includere. Quindi, come ho detto ... esempio. Non siamo psichici, sai. :) –

+0

Grazie. Proverò il '# ifndef' Non ci avevo pensato. – Reid

6

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 numbers2altrove 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.

+0

è la ragione per non includerlo in un file di intestazione, per il fatto che si tratta di un sistema incorporato, che richiederà più spazio su disco? – Abdul

+0

@Abdul - Spero che sia più chiaro. Se si tratta di un sistema incorporato, probabilmente non ha un disco. – gbulmer

+0

dov'è il binario eseguibile memorizzato in sistemi incorporati che non dispongono di dischi? – Abdul

1

Ho avuto un problema simile. Nel mio caso, avevo bisogno di una serie di costanti per poter usare come dimensione di altri array statici. Quando ho cercato di usare il

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

e quindi dichiarare:

int my_static_array[my_const_array[0]]; 

ottengo un errore dal mio compilatore:

array bound is not an integer constant 

Così, finalmente ho fatto la seguente (Forse ci sono modi più eleganti per farlo):

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