2012-03-23 11 views
6

Ich habe mehrere 450 Element Character Arrays (Speichern von Bitmap-Daten zur Anzeige auf LCD-Bildschirmen). Ich möchte sie unter einer Header-Datei und #define ihnen, aber ich bekomme immer Kompilierungsfehler. Wie würde ich das in C tun?Definieren Array in C

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

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

#define numbers[450] legen Sie dann die Zahlen später

und viele mehr ...

+6

Warum p nicht Hast du den Code, den du bisher hast und welche Compilerfehler du bekommst? –

+1

Sie können so etwas nicht "definieren". Denk darüber nach; Jedes Mal, wenn Sie es verwenden, würden Sie ein neues Array deklarieren. Das wird natürlich zu mehreren Neudefinitionen führen. Makros sind einfach Textsubstitution. Ersetzen Sie den Text selbst und sehen Sie, ob es Sinn ergibt. –

Antwort

9

Nun ... Sie brauchen ganz sicher kein definieren zu verwenden. Fügen Sie sie einfach als statische, statische Arrays in den Header ein.

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

Auch, wenn Sie auf einem Übersetzungsfehler helfen wollen, dann sollten Sie Ihren Code schreiben.

+0

Ja, aber wenn der Header mehr als einmal aufgerufen wird (es wird in mehreren Teilen des Programms benötigt), erhalte ich Fehler. – Reid

+2

Dann verwenden Sie einen [include guard] (http://en.wikipedia.org/wiki/Include_guard) und noch einmal, Beispiele zeigen. Ich weiß nicht, was es heißt, "einen Header zu nennen", aber ich nehme an, du meinst mit einschließen. Also, wie ich schon sagte ... Beispiel. Wir sind kein Hellseher, weißt du? :) –

+0

Danke. Ich werde das '# ifndef' versuchen, an das ich nicht gedacht habe. – Reid

6

Da Sie auf einem LCD angezeigt werden, gehe ich davon aus, dass es sich um ein eingebettetes System handelt.

Legen Sie die Daten nicht in eine Kopfzeile.

Legen Sie die Daten in eine normale C- oder C++ - Datei. Kompilieren Sie das. Es enthält möglicherweise nur die Daten, das ist in Ordnung, und macht es einfach zu aktualisieren.

Verwenden Sie dann die Header-Datei, um den Zugriff auf die Daten zu ermöglichen.

Zum Beispiel in einer images.c Datei:

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

Die die images.h ist:

#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 

Dann werden alle anderen .c-Dateien in das Programm auf sie zugreifen können.

Es ist (fast) immer eine schlechte Idee, eine Definition ein Variable in eine Header-Datei zu setzen.

Eine Deklaration einer Variablen, z. sagt dem C-Compiler, dass es eine Arrayvariable namens numbers2woanders im endgültigen, verknüpften Programm gibt. Wenn der Linker diese Definition (von woanders) nicht erhält, wird ein Fehler ausgelöst, da für die zugewiesene Variable kein Platz ist.

Eine Definition einer Variablen (notice no extern), z. byte numbers2[MAX_NUMBERS2]; teilt dem C-Compiler effektiv mit, dass es eine Arrayvariable namens numbers2 gibt, die den Speicherplatz hier im resultierenden Objektcode aus dieser Quelldatei zuweisen soll, und dies wird verwendet, um den Wert der Variablen im final zu halten , verknüpftes Programm.

Der Raum für numbers2 ist nicht durch den C-Compiler zugewiesen wird, wenn er eine Erklärung (vorangestellten extern) sieht, zugeordnet wird, wenn sie die tatsächliche Definition sehen (keine extern).

Wenn Sie also die tatsächliche Definition einer Variablen in eine Header-Datei einfügen und sie in mehr als eine Quellcodedatei (.c) einbinden, wird der C-Compiler mehr als einmal Speicherplatz für die Variable zuweisen. Dann gibt der Linker einen Fehler (in der Regel mehrere Definitionen mit demselben Namen).

Es gibt ein subtileres Problem. Wenn bei der ersten Entwicklung des Programms die Headerdatei nur eine Quelldatei enthält, wird das Programm korrekt kompiliert und verknüpft. Wenn zu einem späteren Zeitpunkt eine zweite Quellendatei den Header enthält (möglicherweise hat jemand gerade die ursprüngliche Quellcodedatei in zwei Dateien aufgeteilt), löst der Linker einen Fehler mit mehreren Definitionen aus. Dies kann sehr verwirrend sein, da das Programm zum Kompilieren und Verknüpfen verwendet wurde, und anscheinend hat sich nichts geändert.

Zusammenfassung
zuteilen niemals Platz für eine Variable durch eine Definition in einer Header-Datei setzen. Fügen Sie nur Variablendeklarationen in Header-Dateien ein.

+0

ist der Grund, es nicht in eine Header-Datei aufzunehmen, da es ein eingebettetes System ist, das mehr Speicherplatz benötigt? – Abdul

+0

@Abdul - Ich hoffe, das ist klarer. Wenn es ein eingebettetes System ist, hat es wahrscheinlich keine Festplatte. – gbulmer

+0

Wo ist die ausführbare Binärdatei in eingebetteten Systemen gespeichert, die keine Festplatten haben? – Abdul

1

Ich hatte ein ähnliches Problem. In meinem Fall brauchte ich ein Array von Konstanten, um die Größe anderer statischer Arrays zu verwenden. Als ich die

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

zu verwenden versucht, und dann erklären:

int my_static_array[my_const_array[0]]; 

ich einen Fehler von meinem Compiler erhalten:

array bound is not an integer constant 

So, endlich habe ich die folgenden (Vielleicht gibt es elegantere Möglichkeiten, das zu tun):

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