2017-04-16 14 views
2

Objective-Cで16ビット/チャンネルまたは48bppのイメージを配列として作成しようとしていますが、これをNSBitmapImageRepに入れようとしています。最初は、それがうまく動作するかどうかを確認するためにノイズを埋めたいので、C forループを使用しています。何らかの理由でセグメンテーションフォルト11が作成されています。私は単純な.cファイルでこのEXACTコードスニペットを試しましたが、それはまったく問題なく動作します。これは、アプリケーションの主な機能で起こっている方法では、私はそれをボタンのクリックでメソッドから行うが、それはグローバルではないので、そこから配列にアクセスする方法を知らない(それについてのいくつかのヒントもあります)。 また、私は16ビットピクセルの代わりにuint8_tを使ってみましたが、違いはありません。知っている人にセグメンテーションフォールト11 Objective-C、C言語ではありません

int sizeElements = 1880 * 1056 * 3; 
int sizeBytes = sizeElements * sizeof(uint16_t); 
uint16_t * imagearray = (uint16_t *)malloc(sizeBytes); 
for (int i = 1; i < sizeElements; i++) 
{ 
    imagearray[i] = rand() % 65536; 
} 
NSBitmapImageRep * theBitmap = [ 
    [NSBitmapImageRep alloc] 
    initWithBitmapDataPlanes: (unsigned char * _Nullable * _Nullable)imagearray 
    pixelsWide: 1880 
    pixelsHigh: 1056 
    bitsPerSample: 16 
    samplesPerPixel: 3 
    hasAlpha: NO 
    isPlanar: NO 
    colorSpaceName: @"NSDeviceRGBColorSpace" 
    bitmapFormat: 0 
    bytesPerRow: 1880 * 3 * 2 
    bitsPerPixel: 48 
]; 

おかげで、これは時間のために私を傷つけてきた:(

編集:ビットマップデータプレーンとしてNULLで初期化するには、障害を取り除きますが、そうforループを削除しないのはなぜこれは、どのように私はそれが

EDIT作業を取得することができます。おかげで飛行機の配列は、ピクセルデータではありません

+0

配列の最初の要素を初期化していない理由は何ですか?また、 'malloc'の呼び出しが成功したことを確認していますか? Cでクラッシュしないという理由だけで、必ずしも同じバグがそこに存在しないというわけではありません。それはちょうどそれが衝突を引き起こさなかったことを意味する。 – user1118321

+0

要素[0]を設定しないのはなぜですか? –

+0

@ user1118321ランダムなことを指摘してくれてありがとうが、それは助けにならなかった、私はおそらくバグを見つけようとしていた。 –

答えて

3

、それはPIXEへのポインタの配列です@everyoneWhoAnswered、&imagearrayが助けた:?このような&を追加しますlデータ。間に別の配列を配置する必要があります。

あなたの場合は、画像が平面でないため、ピクセルデータポインタが最初の要素にあり、その他がNULLに設定されている配列です。

+0

または、単に 'imageArray'の代わりに'&imageArray'を渡してください。 – user1118321

+0

@ user1118321とuliwitnessありがとう、それを試して完全に忘れてしまった。どうもありがとう! noobynessについて申し訳ありません。 –

関連する問題