2012-03-23 22 views
6

Tengo varias matrices de caracteres de 450 elementos (almacenamiento de datos de mapas de bits para mostrar en pantallas lcd). Me gustaría ponerlos bajo un archivo de encabezado y #define, pero sigo recibiendo errores de compilación. ¿Cómo haría esto en C?Definir matriz en C

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

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

#define numbers[450] continuación, establezca los números más adelante

y muchos más ...

+6

¿Por qué no p ¿Cuál es el código que tiene hasta ahora y qué errores de compilación recibe? –

+1

No se puede '# definir' algo así. Piénsalo; cada vez que lo use declarará una nueva matriz. Por supuesto, eso llevará a redefiniciones múltiples. Las macros son simplemente sustitución de texto. Sustituya el texto usted mismo y vea si tiene sentido. –

Respuesta

9

Bueno ... desde luego no necesita utilizar un definen. Solo agréguelos al encabezado como const, arrays estáticos.

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

Además, si desea ayuda en un error de compilación entonces usted debe publicar su código.

+0

Sí, pero cuando se llama al encabezado más de una vez (se necesita en varias partes del programa) obtengo errores. – Reid

+2

Luego usa un [incluir guardia] (http://en.wikipedia.org/wiki/Include_guard) y de nuevo, muestra ejemplos. No sé lo que significa "llamar un encabezado", pero supongo que quieres decir incluir. Entonces, como dije ... ejemplo. No somos videntes, ya sabes. :) –

+0

Gracias. Voy a probar el '# ifndef' que no había pensado sobre eso. – Reid

6

Si está visualizando en una pantalla LCD, supongo que se trata de un sistema integrado.

No coloque los datos en un encabezado.

Coloque los datos en un archivo ordinario de C o C++. Compila esto. Puede contener solo los datos, eso está bien y facilita la actualización.

A continuación, utilice el archivo de encabezado para dar acceso a los datos.

Por ejemplo, en un archivo images.c:

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

El la images.h es:

#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 

A continuación, todos los demás archivos .c en el programa pueden acceder a ellos.

Es (casi) siempre una mala idea poner una definición de una variable en un fichero de cabecera.

A declaración de una variable, p. Ej. extern byte numbers2[MAX_NUMBERS2]; le dice al compilador de C que hay una variable de matriz llamada numbers2en otro lugar en el programa final vinculado. Si el enlazador no obtiene esa definición (de otro lugar), generará un error porque no hay espacio para la variable asignada.

Definición de variable (aviso no extern), p. Ej. byte numbers2[MAX_NUMBERS2]; le dice al compilador de C que hay una variable de matriz llamada numbers2 y debe asignar el espacio aquí, en el código objeto resultante de este archivo fuente, y esto se usará para mantener el valor de la variable en el final , programa vinculado

El espacio para numbers2 es no asignado por el compilador de C cuando se ve una declaración (precedido por extern), que se asigna cuando se ve la definición real (sin extern).

Por lo tanto, si coloca la definición real de cualquier variable en un archivo de encabezado e la incluye en más de un código fuente (.c), el compilador de C asignará espacio a la variable más de una vez. Entonces el enlazador dará un error (generalmente múltiples definiciones del mismo nombre).

Hay un problema más sutil. Si, al desarrollar por primera vez el programa, el archivo de cabecera solo se incluye es un archivo fuente, el programa compilará y vinculará correctamente. Luego, en una fecha posterior, si un segundo archivo fuente incluye el encabezado (tal vez alguien acaba de dividir el archivo del código fuente original en dos archivos), el enlazador generará un error de "múltiples definiciones". Esto puede ser muy confuso porque el programa utilizado para compilar y vincular, y aparentemente nada ha cambiado.

Resumen
Nunca asignar espacio para una variable poniendo una definiciónen un fichero de cabecera. Solo coloque declaraciones de variables en archivos de encabezado.

+0

es la razón para no incluirlo en un archivo de encabezado, por la razón de que es un sistema integrado, ¿que ocupará más espacio en disco? – Abdul

+0

@ Abdul - Espero que sea más claro. Si se trata de un sistema integrado, es probable que no tenga disco. – gbulmer

+0

¿dónde está almacenado el binario ejecutable en sistemas integrados que no tienen discos? – Abdul

1

He tenido un problema similar. En mi caso, necesitaba una matriz de constantes para usar como tamaño de otras matrices estáticas. Cuando traté de utilizar el

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

y luego declarar:

int my_static_array[my_const_array[0]]; 

consigo un error de mi compilador:

array bound is not an integer constant 

Así que, finalmente hice lo siguiente (Tal vez hay formas más elegantes de hacerlo):

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