2010-06-18 9 views
21

Ho una matrice definita in un file e in un altro devo usarlo, per EGDelarazione esterna per una matrice?

/* 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]); 
. 
. 
. 

Ora, quando provo a compilarlo mi ha dato errore che dice che sizeof cann't essere utilizzato su incomplete genere.

Qualcuno può dirmi come gestire tale caso in C/C++? Io non voglio gamma pedice in a.c

Grazie in anticipo

+0

Mi sono imbattuto in questo problema oggi. Ho pensato che se il linker può risolvere i riferimenti di oggetti esterni, allora può anche risolvere le loro dimensioni ... Ma sembra che i linker non siano così intelligenti ... – Calmarius

risposta

20

Si potrebbe mettere qualcosa di simile a quanto segue in a.c e poi extern da b.c.

In a.c:

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

E poi nel a.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

Il compilatore non ha abbastanza informazioni durante la compilazione a.C. per determinare la dimensione della matrice. Questa informazione è solo in a.c in cui l'elenco di inizializzazione è in ambito.

Dovrai comunicare le dimensioni in qualche modo. Un metodo è quello di definire anche un int const con le dimensioni e extern. Un'altra possibilità sarebbe quella di usare una sentinella (un valore al di fuori dell'intervallo di dati valido) per indicare la fine dell'array.

0

a mio parere se non si dispone di definizione e definire con sizeof a in un file non viene compilato.

I file sono compilati e memorizzati come file * .obj/* .a. È possibile utilizzare gli array da un altro file grazie alla dichiarazione extern che verrà controllata nel processo di collegamento, dopo la compilazione.

Si desidera dichiarare define (il preprocessore deve aiutare in questo caso. Viene eseguito prima del compilatore).

quindi prima compilation non sarà possibile ottenere matrice da un altro file ...

8

Se volete che il vostro dimensione della matrice sia accessibile come fase di compilazione costante, allora non hai altra scelta, ma per specificare dimensione dell'array esplicitamente nella extern dichiarazione di matrice

extern int a[9]; 

in questo caso diventa la vostra responsabilità di fare in modo che la dimensione dell'array è coerente tra la dichiarazione extern e definizione. È possibile utilizzare una costante manifest per questo, ma sarà comunque responsabilità dell'utente assicurarsi che il numero di inizializzatori tra lo {} e la dimensione dichiarata siano gli stessi.

Se non ti interessa avere la dimensione dell'array come costante di compilazione, puoi fare quello che Mark Wilkins suggerisce nella sua risposta.

0

Vorrei #define ARRAY_MAX (or whatever) in un'intestazione esterna generalmente utilizzata per definire tali elementi, quindi includere quell'intestazione in entrambi i file che ne hanno bisogno. Funziona bene quando tendi a mantenere la maggior parte se non tutti i tuoi define s in uno o due header centrali.

Problemi correlati