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