2013-04-07 3 views
0

CIColorCube CoreImage와 함께 매우 큰 플로트 배열을 사용하여 필터를 만듭니다. 필자는 많은 필터를 작성하고 있으므로 데이터가 반복해서 반복되고 컴파일하는 데 최대 3 분이 걸립니다 (실제로 짜증납니다). 여기에 내가 가지고있는 것 :플로트 배열을 C++로 반환

- (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++에 비교적 익숙합니다. 도와주세요! 아마 꽤 바보 같은 수정 일 겁니다.

EDIT 1

여기에 조각 내 실제 코드입니다. 동일한 형식을 필요로하는 CIColorCube 인스턴스가 여러 개 있기 때문에 각 rgba 채널을 선택기로 보내고 플로트 배열을 반환합니다.

- (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 } 
} 
+1

http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

답변

1

오류는 다음과 같습니다. 해당 배열에 주소를 반환하지만 그 배열은 해당 기능에 대해 범위가 제한되어 있습니다. 즉, 일단 함수가 완료되면 주소를 더 이상 안전하게 사용할 수 없습니다 (예 : 정의되지 않은 동작). float color_cube_data[32]을 더 높은 범위 (예 : 전역, 클래스 등)로 선언하거나 배열을 동적으로 할당해야합니다.

+0

기술적으로는 여전히 유효해야하지만, 함수 호출 리턴 한 후, 주소는 유효하지 않게됩니다. –

+0

@ColeJohnson 사실. 문구를 "더 이상 사용하기에 안전하지 않다"로 바꿀 것입니다. –

+3

다른 함수 호출을 기다릴 필요가 없습니다. C++에 관한 한, UB 만 사용하고 있습니다. – chris

관련 문제