0

フィルターを作成するために、CIColorCube CoreImage と組み合わせて非常に大きな float 配列を使用しています。多くのフィルターを作成しているため、データが何度も繰り返され、コンパイルに最大 3 分かかります (これは本当に面倒です)。ここに私が持っているものがあります:

- (void)performFilter {
    NSData * cube_data = [NSData dataWithBytes:[self colorCubeData] length:32*sizeof(float)];
    CIFilter *filter = [CIFilter filterWithName:@"CIColorCube"];
    [filter setValue:outputImage forKey:kCIInputImageKey];
    [filter setValue:@16 forKey:@"inputCubeDimension"];
    [filter setValue:cube_data forKey:@"inputCubeData"];
}

- (const void*)colorCubeData {
    float color_cube_data[32] = { 1,1,1,1,1,1,1,1.0 };
    return color_cube_data;
}

コードを大幅に縮小しました。次のエラーが表示されます。

Address of stack memory associated with local variable 'color_cube_data' returned

私はC ++に比較的慣れていないので、助けてください! それはおそらくかなりばかげた修正です。

編集1

これが私の実際のコードのスニペットです。同じ形式を必要とする CIColorCube のインスタンスが複数あるため、各 rgba チャネルをセレクターに送信し、float 配列を返すようにします。

- (const void*)colorCubeData:(float)alpha redArray:(NSArray*)redArray blueArray:(NSArray*)blueArray greenArray:(NSArray*)greenArray {
    float r1 = [[redArray objectAtIndex:0] floatValue]/255.0f;
    float r2 = [[redArray objectAtIndex:1] floatValue]/255.0f;
    float b1 = [[blueArray objectAtIndex:0] floatValue]/255.0f;
    float b2 = [[blueArray objectAtIndex:1] floatValue]/255.0f;
    float g1 = [[greenArray objectAtIndex:0] floatValue]/255.0f;
    float g2 = [[greenArray objectAtIndex:1] floatValue]/255.0f;
    color_cube_data[16384] = { r1,g1,b1,1.0,r2,g1,b1,1.0 } 
}
4

1 に答える 1

1

問題は、エラーが示すとおりです。その配列にアドレスを返していますが、その配列はその関数にスコープ制限されています。つまり、関数が完了すると、アドレスは安全に使用できなくなります (つまり、未定義の動作)。float color_cube_data[32]より高いスコープ (グローバル、クラスなど) で宣言するか、配列を動的に割り当てる必要があります。

于 2013-04-07T02:48:34.743 に答える