在iOS / Swift中使用withMemoryRebound时发生致命错误

时间:2018-08-29 15:10:17

标签: ios swift accelerate

我有以下代码来创建表,以使用Swift加速功能在iOS中对图像进行采样

当我将内存反弹到UInt16时(表创建期望该类型是原始类型),这是一个致命错误。

var arr = Array<Float>(repeating: 0, count: 163840)

arr.withUnsafeBufferPointer{
    arr_pointer in do {
         arr_pointer.withMemoryRebound(to: UInt16.self){ // This causes a FATAL ERROR
             arr_r_pointer in do {
                 let table = vImageMultidimensionalTable_Create( arr_r_pointer.baseAddress!,
                            3, 3, dims_r_pointer.baseAddress!, kvImageMDTableHint_Float, 
                            vImage_Flags(kvImageNoFlags), nil )                          
                 vImageMultiDimensionalInterpolatedLookupTable_PlanarF( &srcBuffer,
                                       &destBuffer,nil,table!,
                                       kvImageFullInterpolation,
                                      vImage_Flags(kvImageNoFlags))
             }
        }
    }
}

有人可以在这里指出我的错误吗?

2 个答案:

答案 0 :(得分:1)

您应该已经阅读Note的{​​{1}}函数:

  

注意

     

仅使用此方法将缓冲区的内存重新绑定为与当前绑定的withMemoryRebound类型相同的大小和跨度的类型。至   将内存区域绑定到不同大小的类型,转换   将该缓冲区转换为原始缓冲区,然后使用Element方法。

bindMemory(to:)的大小为 32 位,Float的大小为 16 位,因此它们的大小不同,不能相同反弹。

因此,您应该执行以下操作:

UInt16

还要注意,初始数组中的每个arr.withUnsafeBufferPointer { pointer in let raw = UnsafeRawBufferPointer(pointer) let uints = raw.bindMemory(to: UInt16.self) // use buffer pointer to `UInt16`s here } 都将以这种方式分成两个Float。我不知道那不是你所需要的。

答案 1 :(得分:0)

您的原始数组arrFloat s的数组

var arr = Array<Float>(repeating: 0, count: 163840)

但是您正在尝试将指针绑定到UInt16

arr_pointer.withMemoryRebound(to: UInt16.self)