1

2つのステップで整数の2D配列を宣言する方法はありますか?スコープに問題があります。これが私がやろうとしていることです:

//I know Java, so this is an example of what I am trying to replicate:

int Array[][];
Array = new int[10][10];

さて、OBJ-Cで似たようなことをしたいのですが、構文を正しく理解できません。現在、私はそれを1つのステップで持っていますが、現在持っているIfステートメントの外では使用できません。

int Array[10][10]; //This is based on an example I found online, but I need 
                   //to define the size on a seperate line than the allocation

誰かがこれで私を助けることができますか?おそらくもっと基本的な質問だと思いますが、(私の知る限り)メッセージの外で「new」というキーワードを使用することはできず、intにメッセージを送信することもできません。:(

*編集1:****

私の問題はスコープに関連しています。

//Declare Array Somehow
Array[][] //i know this isn't valid, but I need it without size

//if statement
if(condition)
Array[1][2]
else
Array[3][4]

//I need to access it outside of those IFs

//... later in code
Array[0][0] = 5;
4

2 に答える 2

4

境界の1つのサイズがわかっている場合、これは2D配列を作成するための私の好ましい方法です。

int (*myArray)[dim2];

myArray = calloc(dim1, sizeof(*myArray));

そしてそれは1回の呼び出しで解放することができます:

free(myArray);

残念ながら、これを機能させるには、境界の1つを修正する必要があります。

ただし、どちらの境界もわからない場合は、これも機能するはずです。

static inline int **create2dArray(int w, int h)
{
    size_t size = sizeof(int) * 2 + w * sizeof(int *);
    int **arr = malloc(size);
    int *sizes = (int *) arr;
    sizes[0] = w;
    sizes[1] = h; 
    arr = (int **) (sizes + 2);

    for (int i = 0; i < w; i++)
    {
        arr[i] = calloc(h, sizeof(**arr));
    }

    return arr;
}

static inline void free2dArray(int **arr)
{
     int *sizes = (int *) arr;
     int w = sizes[-2];
     int h = sizes[-1];

     for (int i = 0; i < w; i++)
         free(arr[i]);

     free(&sizes[-2]);
}
于 2012-05-07T16:26:09.797 に答える
0

あなたが示した宣言(例えばint Array[10][10];)はOKであり、それが宣言されたスコープに対して有効です。クラススコープでそれを行う場合、それはクラス全体に対して有効になります。

配列のサイズが異なる場合は、動的割り当て(mallocおよびフレンドなど)を使用するか、NSMutableArray(非プリミティブデータ型の場合)を使用します。

于 2012-05-07T16:21:01.877 に答える