2010-06-18 20 views
21

Tôi có một mảng được định nghĩa trong một tập tin và trong một tôi phải sử dụng nó, cho eg-Delaration bên ngoài cho An Array?

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

Bây giờ khi tôi cố gắng biên dịch nó nó đã cho tôi báo lỗi nói rằng sizeof cann't được sử dụng trên không đầy đủ kiểu.

Ai có thể cho tôi biết cách xử lý trường hợp như vậy trong C/C++? Tôi không muốn mảng subscript trong a.c

Cảm ơn trước

+0

Tôi đã gặp sự cố này ngay hôm nay. Tôi nghĩ nếu mối liên kết có thể giải quyết các tham chiếu của các đối tượng bên ngoài, sau đó nó có thể giải quyết kích thước của họ quá ... Nhưng có vẻ như các liên kết không thông minh nhưng ... – Calmarius

Trả lời

20

Bạn có thể đặt một cái gì đó như sau vào a.c và sau đó extern nó từ b.c.

Trong a.c:

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

Và sau đó trong TC:

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

Trình biên dịch không có đủ thông tin khi biên dịch trước Chúa để xác định kích thước của mảng. Thông tin đó chỉ có trong a.c, trong đó danh sách bộ khởi tạo của bạn nằm trong phạm vi.

Bạn sẽ phải truyền đạt kích thước bằng cách nào đó. Một phương pháp là để xác định một int const với kích thước và extern đó là tốt. Một khả năng khác là sử dụng một sentinel (một giá trị nằm ngoài phạm vi dữ liệu hợp lệ của bạn) để cho biết kết thúc của mảng.

0

theo ý kiến ​​của tôi nếu bạn không có định nghĩa và xác định với sizeof trong một tệp không biên dịch.

Tệp được biên dịch và lưu trữ dưới dạng tệp * .obj/* .a. Bạn có thể sử dụng mảng từ các tệp khác nhờ khai báo extern sẽ kiểm tra quá trình liên kết, sau khi biên dịch.

Bạn muốn khai báo xác định (preprocesor phải trợ giúp ở đây với điều này. Nó được chạy trước bộ compilator).

vì vậy trước khi biên soạn, bạn sẽ không nhận được mảng từ file khác ...

8

Nếu bạn muốn kích thước mảng của bạn để có thể truy cập như một thời gian biên dịch liên tục, sau đó bạn không có lựa chọn nào khác ngoài việc xác định kích thước mảng rõ ràng trong extern khai báo của mảng

extern int a[9]; 

trong trường hợp này nó trở thành trách nhiệm của bạn để đảm bảo rằng kích thước mảng là phù hợp giữa extern khai và định nghĩa. Bạn có thể sử dụng hằng số tệp kê khai cho điều đó, nhưng vẫn sẽ là trách nhiệm của bạn để đảm bảo rằng số lượng trình khởi tạo giữa số {} và kích thước được khai báo là giống nhau.

Nếu bạn không quan tâm để có kích thước mảng dưới dạng hằng số biên dịch, thì bạn có thể làm những gì Mark Wilkins gợi ý trong câu trả lời của mình.

0

Tôi sẽ #define ARRAY_MAX (or whatever) trong tiêu đề bên ngoài thường được sử dụng để xác định những điều như vậy, sau đó bao gồm tiêu đề đó trong cả hai tệp cần. Điều này hoạt động tốt khi bạn có xu hướng giữ hầu hết nếu không phải tất cả các số define của bạn trong một hoặc hai tiêu đề trung tâm.

Các vấn đề liên quan