Неустранимая ошибка при использовании withMemoryRebound в iOS/Swift
У меня есть следующий код для создания таблицы для выборки изображения в 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 ответа
Вы должны были прочитать 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
сюда. Я не знаю, если это то, что вам нужно.
Ваш оригинальный массив arr
это массив Float
s
var arr = Array<Float>(repeating: 0, count: 163840)
но вы пытаетесь привязать указатель к UInt16
arr_pointer.withMemoryRebound(to: UInt16.self)