2016-10-19 7 views
0

В пределах Swift 3 мне нужно отправить данные на объект C, принимающий вход float **.Swift 3 UnsafeMutablePointer инициализация для типа C float **

В Swift 2, я использовал, чтобы объявить UnsafeMutablePointer< UnsafeMutablePointer<Float32>>, построить быстрый Array (только для инициализации!), И передать это указатель, и это сработало:

var bufferOut: UnsafeMutablePointer< UnsafeMutablePointer<Float32>>? 
    arrayOut = Array(repeating: Array(repeating: 0, count: Int(size1), count: Int(size2)) 
    bufferOut = UnsafeMutablePointer< UnsafeMutablePointer<Float32>>(arrayOut) 

Это все сломаны сейчас Swift 3!

  • Что представляет собой самый Swifty способ передать C-Style float** и инициализировать его?
  • Что было бы лучшим способом присвоить значения в UnsafeMutablePointer< UnsafeMutablePointer<T>>?

В документах указано, что для T ** следует использовать AutoreleasingUnsafeMutablePointer<T>, но на самом деле мне никогда не удалось его построить!

Обратите внимание, что я действительно не забочусь о массиве в приведенном выше примере! Если бы я мог просто инициализировать указатель напрямую, используя известные возможности, я бы это сделал.

Примечание: Expected use cases Section of UnsafeRawPointer описывает полезные ситуации, такие как C-массив и C-буферы, однако перевод таких методов для вышеуказанной конструкции не является очевидным!

ответ

2

Вот что я в итоге сделал и работает. Он следует рекомендациям от new UnsafeMuTablePointer Reference, показывающим примеры программ на простых схемах. Таким образом, необходимо выделить и назначить каждый слот, начиная с верхнего уровня!

Так что для того, чтобы построить UnsafeMutablePointer< UnsafeMutablePointer<T>> размера (size1, size2) (как матрицы), вы можете идти вперед следующее использование промежуточного вектора здесь под названием vectorBuf:

var vectorBuf : UnsafeMutablePointer<T>? 
    vectorBuf = UnsafeMutablePointer<T>.allocate(capacity: size2) 
    for index in 0...(size2) {  // had Int(channelCount)* 
     vectorBuf!.advanced(by: index).pointee = 0.0 
    } 

    /// This is where allocation and initialization happens: 
    bufferOut = UnsafeMutablePointer< UnsafeMutablePointer<T>?>.allocate(capacity: Int(size1)) 
    for index in 0...Int(size1) { 
     bufferOut!.advanced(by: index).pointee = UnsafeMutablePointer<T>.allocate(capacity: (size2)) 
     bufferOut!.advanced(by: index).pointee?.assign(from: vectorBuf!, count: size2) 
    } 

Надеется, что это может быть полезно другим, пытающимся использовать быстрые вызовы обработки сигналов в C/C++!

 Смежные вопросы

  • Нет связанных вопросов^_^