2016-04-18 18 views
1

私は、このコードは動作しません知っているが、どのように私は実際にこれを正しく初期化できます?:多次元プリミティブ整数配列

NSUInteger highestModelID = 34605; 
NSUInteger highestColorID = 328; 
NSUInteger** modelColors[highestModelID][highestColorID] = malloc(highestModelID * highestColorID * sizeof(NSUInteger)); 

をSO 2つのダイナミック深さを有します。私は多量のバッファーを多量のメモリであるNSMutableDictionaryに持っています。私は本当にこの原始的なことをしたいです。

Objective-Cの辞書やさらにNSMutableArrayさえ実際にちょっと残虐な場所でも使用できるようにするには、これをクラスから外すことがさらに魅力的だと思います。時間がたつにつれて、私は実際にはgolangで慣れ親しんだスーパーライトである何かのためにNSNumberを使って、もっと迷惑になりつつあります。

+1

この質問は役に立ちました:http://stackoverflow.com/questions/10575544/difference-between-declaration-and-malloc基本的には、メモリをmallocしている場合は、 'modelColors'宣言の' [highestModelID] [highestColorID] '接尾辞を削除する必要があります。 – Hamish

+0

このヒントをありがとう!私はネイティブCをもう使用することはほとんどありません。私は真剣に低レベルのCを使用した最後の時間は、Visual Basic 6(?)で17年前だったと思います。私はそれがもうちょうどそれのハングアップを取得するために、おそらくいくつかのoldschool NASM/Cツーツを行うことは良いと思う:) –

答えて

2

あなたはこの必要があります:あなたはこのように使用することができます

NSUInteger* modelColors = malloc(highestModelID * highestColorID * sizeof(NSUInteger)); 

NSUInteger getModelColor(int modelID, int colorID, int highestModelID, NSUInteger* modelColors) { 
    return modelColors[colorID * highestModelID + modelID]; 
} 

void setModelColor(NSUInteger color, int modelID, int colorID, int highestModelID, NSUInteger* modelColors) { 
    modelColors[colorID * highestModelID + modelID] = color; 
} 

基本的にはこれが2次元配列は、ここでmodelIDインデックス行、およびcolorIDインデックスの列(行主要レイアウトを前提としています)。

+0

これは完璧に機能します。私は 'EB2DArray'というクラスにそれを埋め込むので、配列の寿命の残りの2つの最も高いIDを簡単に覚えることができます。' get * 'と' set * modelID'と 'colorID'です。異なる型付き配列の可能性を多く開きます。ありがとう! –

+0

それは良い考えです! –

+0

配列を解放するのは自分の責任ですか? ARCは私のクラス内の '@property'を私が作る' EB2DArray'オブジェクトの一部として見ないことを知っています。おそらく、配列 ' - (void)dealloc {free(self.theArray);}を保持する' @ property'で 'free()'を呼び出すために 'dealloc'をオーバーライドする必要があります。 } '? –

2

方法はそれを作成することは、NSArraysのNSArrayを作成することと実際には違いはありません。 NSUInteger *の配列を最初に割り当ててから、その要素のそれぞれを割り当てる必要があります。

NSUInteger **modelColors; 
modelColors = malloc(highestModelID * sizeof(NSUInteger*)); 
for (int i = 0; i < highestModelID; i++) { 
    modelColors[i] = malloc(highestColorID * sizeof(NSUInteger)); 
} 
+1

間違っています。あなたは 'highestModelID'割り当てをしていますが、これは' highestModelID * highestColorID'サイズの単一の 'malloc'で行うことができます。 –

+0

早すぎる最適化ですか? :D OPの主な関心事はメモリ使用量でした。あなたは、おそらく 'malloc'は要求しているバイト数を正確に割り振らないが、最も近いサイズのクラスに丸めます。したがって、 'highestModelID'個の割り当てを使用すると、N *' highestModelID'バイトが無駄になります。 (Nは 'highestColorID'と最も近いサイズのクラスの違いです) –

+0

@TamásZaholaああ、私の悪い質問のメモリの問題を見ていない! – Hamish