Неустранимая ошибка при использовании 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 это массив Floats

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

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

arr_pointer.withMemoryRebound(to: UInt16.self)
Другие вопросы по тегам