2009-03-17 10 views
8

私は私のメインのファイルにこのコードを持っている:私は私のクラス全体の変数にアクセスできるようにObjective-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 }; 

がどのように私は私のヘッダで定義されていますか?

答えて

8
extern int grid[]; 

のは、あなたがこのようないくつかのコードを持っていたとしましょう:

:あなたは、たとえば、2つの異なるファイル、たとえば、あなたは以下を持っている可能性の中にこれを分離したい場合

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; 
} 

main.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 }; 

grid.cで0
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

どのように私は、実装ファイルで配列を作成しますか? –

+0

それ以外の場所には構築する必要はありません。上記のコードをmain.cに置き、グリッドを使用する他のソースファイルで使用される共通のヘッダーファイルに "extern int grid []"を入れます。ヘッダーが不要な場合は、グリッドが使用されている場所にexternを配置してください。 – Parappa

+0

コンパイルされますが、別の関数から配列にアクセスしようとすると、コンパイラはエラーをスローします:/ –

6

ヘッダーに定義することはできません。あなたがソース(.m)ファイルで、それはあなたのヘッダーで宣言に持っているとにそれを定義します。

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

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

がコンパイルされますが、私が* .mファイル内の別の関数に入っているとき、コンパイラは未定義であると不平を言っています。 –

+0

.mファイルの "トップレベル"(つまり、すべての関数外)で定義します。慣例として、このようなグローバル変数は、.mファイルの先頭、#importまたは#include文の直下に定義されています。 –

+0

グリッド[]を使用する必要があるヘッダファイルでは、 "extern int grid []"宣言が必要です。または、extern宣言を持つ別のヘッダファイルを#includeする必要があります。 http://stackoverflow.com/questions/309801/declarations-definitions-initializations-in-c-c-c-java-and-pythonも参照してください。 –

関連する問題