[英]Fatal error when using withMemoryRebound in iOS/Swift
我有以下代码来创建一个表,用于使用 Swift 加速功能在 iOS 中对图像进行采样
当我将内存反弹到 UInt16 时,表创建期望从原始类型 Int 得到一个致命错误。
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))
}
}
}
}
有人能在这里指出我的错误吗?
您应该已经阅读了withMemoryRebound
函数的Note
:
笔记
仅使用此方法将缓冲区的内存重新绑定到与当前绑定的
Element
类型具有相同大小和步幅的类型。 要将内存区域绑定到不同大小的类型,请将缓冲区转换为原始缓冲区并使用bindMemory(to:)
方法。
Float
大小是32位, UInt16
大小是16位,所以大小不一样,不能反弹。
所以你应该做这样的事情:
arr.withUnsafeBufferPointer { pointer in
let raw = UnsafeRawBufferPointer(pointer)
let uints = raw.bindMemory(to: UInt16.self)
// use buffer pointer to `UInt16`s here
}
但还要注意,初始数组中的每个Float
都会以这种方式拆分为两个UInt16
。 我不知道这是否是你需要的。
您的原始数组arr
是一个Float
数组
var arr = Array<Float>(repeating: 0, count: 163840)
但您正试图将指针绑定到UInt16
arr_pointer.withMemoryRebound(to: UInt16.self)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.