2

私はOOPの初心者なので、これはばかげた質問かもしれません!

object-c クラスのインスタンス変数として多次元 CArray を使用したいと思います。また、オブジェクトの初期化メソッド中に、実行時にそのサイズを指定できるようにしたいと考えています。

@interface ArrayClass : NSObject {

int array[][];

}

-(id)initWithSizeX:(int)sizeX sizeY:(int)sizeY;

@end

これにより、「インスタンス変数 'array' のサイズが不明です」というエラーが発生します。

たとえば [20][20] など、初期サイズがあると宣言した場合にのみ、配列を使用できるように見えますが、実行時に決定したいので、もちろんそれはポイントを無効にします!

オブジェクトのメモリフットプリントを事前に知る必要があるため、これが必要だと思いますか?

私がこれにしようとしていることがまったく可能かどうか、誰かが知っていますか? 実行時に配列のサイズを変更できる回避策はありますか? それとも、これについて完全に間違った方法で行っていますか?

多次元配列に関するトピックがたくさんあることは知っていますが、私の質問に答えるものが見つからないようです!

4

2 に答える 2

3

あなたはObjective-Cで作業しているので、使用を検討するかもしれませんNSArray(またはNSMutableArray配列で何をするつもりかによって)。これにより、Objective-C メッセージを送信し、単なるメモリのチャンクではなくオブジェクトであるため (配列は C にあるため)、より多くの機能を「無料で」取得できます。また、ARC またはガベージ コレクションを使用している場合は、メモリが管理されます。

しかし、C 配列を使用したいことがわかっている場合 (これは完全に有効です)、C で通常行うのと同じように、コードでそれmallocを使用する必要があります。freeあなたが指摘したように、コンパイル時に定義されたサイズの静的配列を作成すると、これを回避できます。)

編集: @Mahesh がコメントで指摘したように、array変数を
int **array;
の代わりにとして宣言する必要があります
int[][] array;

さらにヘルプが必要な場合は、こちらをご覧ください。

于 2012-11-07T22:37:33.763 に答える
2

可能であれば、NSArray または派生物を使用してください。C配列でなければならない場合は、単一線形のmalloc()で実行し、2次元の計算を自分で行うことができます。いえ

int *ar = malloc(sizeof(int) * nrows * ncols);

そして、オフセットの演算によって適切な「セル」にアクセスします

// access cell at [n,m]
ar[n*ncols+m] = value;

私は通常、値の配列へのポインターの配列を管理しようとするよりもはるかに簡単だと思いますが、マイレージは異なる場合があります。

または、行-malloc-ハッピーリストに行かずに多次元の動的配列で真の「マルチ」が必要な場合に備えて、これを最後に保存し、C コンパイラーが VLA (Variable長さ配列)。C99 は、実装レベルで変数配列宣言をサポートします (つまり、コンパイラは、標準で定義されている機能をサポートできますが、必須ではありません。詳細については、C99 標準の 6.7.6.2 を参照してください)。コンパイラがサポートしていない場合は、定義済みのマクロ、__STDC_NO_VLA__定義する必要があり、コンパイル時にテストできます (C99 標準のセクション 6.10.8.3-1 を参照)。そうは言っても、私が過去 10 年以上使用してきたすべての C99 準拠のコンパイラはそれをサポートしています。OPについては、Xcodeでgccまたはllvmのいずれかを使用している場合、あなたのものを保証します。__STDC_NO_VLA__それ以外の場合は、が定義されているかどうかをテストしてください。でない場合、その機能サポートされています。

int nrows = 10, ncols = 15;
int (*ar)[cols] = malloc(sizeof(int) * nrows * ncols);

すぐにいくつかのことに注意してください。配分は前回と全く同じです。ただし、宣言されている変数は少し異なります。ここでの宣言は、それが整数arの配列へのポインタであることを示しています。ncolsの倍数を割り当てる限りncols(これは を掛けることによって行いますnrows)、結果として得られる行列は、おなじみの添字を使用してアクセスできるようになります。

// for any n'th row, m'th column
ar[n][m] = value;
于 2012-11-07T22:44:02.963 に答える