цель c — вернуть массив с плавающей точкой в ​​переполнение стека

Я использую очень большой массив с плавающей запятой в сочетании с CIColorCube CoreImage для создания фильтров. Поскольку я делаю много фильтров, данные повторяются снова и снова, и на их компиляцию уходит до 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 селектору и возвращаю массив с плавающей точкой.

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

0

Решение

Проблема, как говорит ошибка. Вы возвращаете адрес этому массиву, но этот массив ограничен областью действия этой функции, а это означает, что после того, как функция будет завершена, адрес больше не будет безопасным для использования (т.е. неопределенное поведение). Вы должны объявить float color_cube_data[32] в более высоком объеме (например, глобальный, класс и т. д.) или динамически размещать массив.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]