Неустранимая ошибка при использовании withMemoryRebound в iOS / Swift - PullRequest
0 голосов
/ 29 августа 2018

У меня есть следующий код для создания таблицы для выборки изображения в iOS с использованием функций ускорения Swift

Когда я возвращаю память к 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))
             }
        }
    }
}

Может ли кто-нибудь указать на мою ошибку здесь?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы должны были прочитать Note для withMemoryRebound функции:

Примечание

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

0 голосов
/ 29 августа 2018

Ваш исходный массив arr - это массив Float s

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

но вы пытаетесь привязать указатель к UInt16

arr_pointer.withMemoryRebound(to: UInt16.self)
...