繁体   English   中英

在 iOS/Swift 中使用 withMemoryRebound 时出现致命错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM