2010-06-18 6 views
21

tengo una matriz definida en un archivo y en otro tengo que usarlo, por EGDelaracion externa para una matriz?

/* a.c - defines an array */ 

int a[] = {1,2,3,4,5,6,7,8,9}; 


/* b.c - declare and use it. */ 

#define COUNT ((sizeof a)/(sizeof int)) 
extern int a[]; //size of array 

. 
. 
. 

int i; 
for(i=0; i<COUNT; i++) 
    printf("%d", a[i]); 
. 
. 
. 

Ahora, cuando intento compilar lo que me dio error diciendo que sizeof cann't usarse en información incompleta tipo.

¿Alguien puede decirme cómo manejar este caso en C/C++? Yo no quiero subíndice en A.C.

Gracias de antemano

+0

Me encontré con este problema hoy. Pensé que si el enlazador puede resolver las referencias de objetos externos, también puede resolver sus tamaños ... Pero parece que los vinculadores aún no son tan inteligentes ... – Calmarius

Respuesta

20

Es posible poner algo como lo siguiente en a.c y luego extern desde b.c.

En A.C.:

int a[] = {1, 2, 3}; 
const int lengthofa = sizeof(a)/sizeof(a[0]); 

Y luego, en b.c:

extern int a[]; 
// the extern (thanks Tim Post) declaration means the actual storage is in another 
// module and fixed up at link time. The const (thanks Jens Gustedt) prevents it 
// from being modified at runtime (and thus rendering it incorrect). 
extern const int lengthofa; 

void somefunc() { 
    int i; 
    for (i = 0; i < lengthofa; i++) 
    printf("%d\n", a[i]); 
} 
0

El compilador no tiene suficiente información al compilar b.c para determinar el tamaño de la matriz. Esa información solo está en a.c donde su lista de inicializadores está dentro del alcance.

Tendrás que comunicar el tamaño de alguna manera. Un método es definir una const int con el tamaño y extern eso también. Otra posibilidad sería usar un centinela (un valor fuera de su rango de datos válido) para indicar el final de la matriz.

0

en mi opinión, si no tiene definición y define con sizeof a en un archivo, no compila.

Los archivos se compilan y almacenan como archivos * .obj/* .a. Puede usar matrices de otros archivos gracias a la declaración externa que se verificará en el proceso de enlace, después de la compilación.

Quiere declarar definir (el preprocesador debe ayudar aquí con esto. Se ejecuta antes del compilador).

así que antes de la compilación no se va a matriz a partir de otro archivo ...

8

Si desea que su tamaño de la matriz para que sean accesibles como en tiempo de compilación constante, entonces no tiene otra opción que especifica el tamaño del arreglo explícitamente en la declaración de la matriz extern

extern int a[9]; 

en este caso se convierte en su responsabilidad de asegurarse de que el tamaño del arreglo es consistente entre la declaración extern y definición. Puede usar una constante de manifiesto para eso, pero igual será su responsabilidad asegurarse de que la cantidad de inicializadores entre {} y el tamaño declarado sea la misma.

Si no le interesa tener el tamaño de matriz como una constante en tiempo de compilación, puede hacer lo que Mark Wilkins sugiere en su respuesta.

0

me habría #define ARRAY_MAX (or whatever) en un encabezado externo que se utiliza generalmente para definir este tipo de cosas, a continuación, incluir esa cabecera en ambos archivos que lo necesiten. Esto funciona bien cuando tiendes a guardar la mayoría si no todos tus define s en uno o dos encabezados centrales.

Cuestiones relacionadas