0

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

在 Swift 2 中,我曾经声明 a UnsafeMutablePointer< UnsafeMutablePointer<Float32>>,构造一个 swift Array(仅用于 init!),然后将其传递给指针,并且它起作用了:

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

现在在 Swift 3 中这一切都被打破了!

  • float**传递 C 样式并初始化它的最快捷方式是什么?
  • 在 a 中分配值的最佳方法是UnsafeMutablePointer< UnsafeMutablePointer<T>>什么?

文档说T **应该使用AutoreleasingUnsafeMutablePointer<T>,但我实际上从未设法构建一个!

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

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

4

1 回答 1

2

这是我最终做的事情,并且正在工作。它遵循新的 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++ 中使用 swift 进行信号处理调用的其他人有用!

于 2016-10-19T15:16:38.273 回答