Swift 3 UnsafeMutablePointer初始化C类型float **

在Swift 3中,我需要将数据发送到接受float **输入的C对象。

在Swift 2中,我曾经声明一个UnsafeMutablePointer< UnsafeMutablePointer> ,构造一个swift数组(仅用于init!),并将其传递给指针,它工作正常:

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

现在Swift 3中全部破坏了!

  • 传递C-Style float**并初始化它的最快捷的方法是什么?
  • UnsafeMutablePointer< UnsafeMutablePointer>分配值的最佳方法是什么?

Documentations说对于T **应该使用AutoreleasingUnsafeMutablePointer但实际上我从未设法构建一个!

请注意,我并不真正关心上面示例中的数组! 如果我可以直接使用已知容量初始化指针,我会的。

注意 : UnsafeRawPointer的预期用例部分描述了有用的情况,例如C数组和C缓冲区,但是为上述结构翻译这些方法并不明显!

这是我最终做的并且正在工作。 它遵循新的UnsafeMuTablePointer Reference的建议, 该参考显示了关于简单方案的示例程序。 总之,需要从顶层开始分配分配每个槽!

因此,为了构造一个大小( UnsafeMutablePointer< UnsafeMutablePointer>UnsafeMutablePointer< UnsafeMutablePointer> (就像一个矩阵),你可以使用一个名为vectorBuf的中间向量,如下所示:

  var vectorBuf : UnsafeMutablePointer? vectorBuf = UnsafeMutablePointer.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?>.allocate(capacity: Int(size1)) for index in 0...Int(size1) { bufferOut!.advanced(by: index).pointee = UnsafeMutablePointer.allocate(capacity: (size2) ) bufferOut!.advanced(by: index).pointee?.assign(from: vectorBuf!, count: size2) } 

希望这对于试图在C / C ++中使用swift和信号处理调用的其他人有用!