2

#defines の代わりにメンバー変数を使用して 2 次元配列の境界を定義するようにクラスを更新しています。以前は次のように表示されていました。

#define kWidth 3
#define kHeight 100
NSUInteger fields[kWidth][kHeight];

kWidth と kHeight は iVar です。境界を変更できるようになったため、他に選択肢がないため、malloc 規則に切り替えました。問題は、2 つの [] ([][]) を使用して配列にアクセスできないことです。私のインライン コメントを参照してください。私は正しくmallocしたと確信しています。これまで何度も、iOS でこれを行ってきました。この方法でアクセスできないのはなぜですか?

self.kFieldsHeight = 100;
self.kFieldsWidth = 3;
NSUInteger** fields = (NSUInteger**)malloc(sizeof(NSUInteger) * self.kFieldsHeight * self.kFieldsWidth);
memset(fields, 0xFF,  self.kFieldsWidth * self.kFieldsHeight * sizeof(NSUInteger));

//// Now with LLDB I can examine the array in one dimension
// p fields[0]      // 0xFFFFFFFF
// p fields[299]    // 0xFFFFFFFF
// p fields[300]    // 0xGARBAGE

//// THIS fails with "error: Couldn't dematerialize struct : Couldn't read a composite type from the target: gdb remote returned an

エラー: E08" // p フィールド [0] [0]

// Thus this fails in my code
NSUInteger i = fields[0][0];

どうしたんだ?

編集:(詳細)次のようにmallocingも試しました:

fields = (NSUInteger**)malloc(sizeof(NSUInteger*) * self.kFieldsHeight);
if(fields){
    for(int i = 0; i < self.kFieldsHeight; i++){
        fields[i] = (NSUInteger*)malloc(sizeof(NSUInteger) * self.kFieldsWidth);
    }
}

編集:(さらに詳細)。同じ結果で幅と高さを交換しました:

fields = (NSUInteger**)malloc(sizeof(NSUInteger*) * self.kFieldsWidth);
if(fields){
    for(int i = 0; i < self.kFieldsWidth; i++){
        fields[i] = (NSUInteger*)malloc(sizeof(NSUInteger) * self.kFieldsHeight);
    }
}
4

2 に答える 2

0

これを行う必要があります:

NSUInteger **fields = malloc(self.kFieldsHeight * sizeof(NSUInteger*));
for (int i = 0; i < self.kFieldsHeight; i++) {
     fields[i] = malloc(sizeof(NSUInteger) * self.kFieldsWidth);
     memset(fields, 0xFF,  self.kFieldsWidth * sizeof(NSUInteger));
}

しかし、これはほとんどの人が仕事をする方法ではありません。ほとんどの開発者は、2 次元配列の代わりに大きな配列を使用し、自分でインデックスを作成しようとします。このような:

NSUInteger *fields = malloc(self.kFieldsHeight * self.kFieldsHeight *  sizeof(NSUInteger));
fields[h * width + w] = pixel_value;
于 2012-11-01T21:22:06.893 に答える
0

これを試して

fields = (NSUInteger**)malloc(sizeof(NSUInteger*) * self.kFieldsWidth);
if(fields){
    for(int i = 0; i < self.kFieldsWidth; i++){
        fields+i = (NSUInteger*)malloc(sizeof(NSUInteger) * self.kFieldsHeight);
    }
}

このようにする本当の理由はありません。a[i] が a+i であるという別の言い方です

于 2012-11-01T21:08:41.557 に答える