2009-03-17 33 views
8

tôi có mã này trong tập tin chính của tôi:Làm cách nào để xác định một mảng trong tệp tiêu đề Mục tiêu-C của tôi?

int grid[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 
       1 , 2 , 3 , 2 , 3 , 2 , 3 , 1 , 
       1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 
       1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 
       1 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 
       1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 
       1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 }; 

Làm thế nào để định nghĩa nó trong phần đầu của tôi để tôi có thể truy cập vào biến khắp lớp học của tôi?

Trả lời

8
extern int grid[]; 

Giả sử bạn có một số mã như thế này:

int grid[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 
     1 , 2 , 3 , 2 , 3 , 2 , 3 , 1 , 
     1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 
     1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 
     1 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 
     1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 
     1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 }; 

int arr_sum(int* arr, int len) 
{ 
    int sum = 0; 
    for (int i = 0; i < len; i++) { 
      sum += arr[i]; 
    } 
    return sum; 
} 

int main(int argc, char** argv) 
{ 
    printf("%d\n", arr_sum(grid, sizeof(grid)/sizeof(int))); 
    return 0; 
} 

Nếu bạn muốn tách này ra thành hai tập tin khác nhau, chẳng hạn, bạn có thể có những điều sau đây, ví dụ:

trong grid.c:

int grid[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 
     1 , 2 , 3 , 2 , 3 , 2 , 3 , 1 , 
     1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 
     1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 
     1 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 
     1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 
     1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 }; 

Trong main.c:

extern grid[]; 

int arr_sum(int* arr, int len) 
{ 
    int sum = 0; 
    for (int i = 0; i < len; i++) { 
      sum += arr[i]; 
    } 
    return sum; 
} 

int main(int argc, char** argv) 
{ 
    printf("%d\n", arr_sum(grid, sizeof(grid)/sizeof(int))); 
    return 0; 
} 
+0

làm thế nào để xây dựng các mảng trong tập tin thực hiện? –

+0

Bạn không cần phải xây dựng nó ở bất cứ nơi nào khác. Có mã mà bạn đã liệt kê ở trên trong main.c và đặt "extern int grid []" trong một tệp tiêu đề chung được sử dụng bởi các tệp nguồn khác sử dụng lưới. Hoặc nếu bạn không muốn tiêu đề, chỉ cần đặt extern bất cứ nơi nào lưới được sử dụng. – Parappa

+0

nó biên dịch, nhưng nếu tôi cố gắng truy cập mảng từ một hàm khác đến nơi nó được xác định, trình biên dịch sẽ gửi một lỗi:/ –

6

Bạn không thể xác định nó trong tiêu đề của mình. Bạn phải tuyên bố nó trong tiêu đề của bạn và xác định nó trong một nguồn (.m) file:

// In MyClass.h 
extern int grid[]; 

// In MyClass.m 
int grid[] = {...}; 
+0

biên dịch, nhưng khi tôi đang ở một chức năng khác trong tệp * .m, trình biên dịch phàn nàn rằng nó không được xác định. –

+0

bạn muốn xác định nó ở "cấp cao nhất" của tệp .m (ví dụ: bên ngoài tất cả các hàm). Theo quy ước, các biến toàn cầu như thế này được định nghĩa ở đầu tệp .m, ngay dưới bất kỳ #import hoặC#include statements nào. –

+0

Bất kỳ tệp tiêu đề nào cần sử dụng lưới [] cần phải có khai báo "extern int grid []" trong đó hoặc cần #include tệp tiêu đề khác có khai báo extern. Xem thêm http://stackoverflow.com/questions/309801/declarations-definitions-initializations-in-c-c-c-java-and-python –

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