【问题标题】:Swift 3 UnsafeMutablePointer initialization for C type float**C 类型浮点的 Swift 3 UnsafeMutablePointer 初始化**
【发布时间】:2016-10-19 10:07:52
【问题描述】:

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

在 Swift 2 中,我曾经声明一个 UnsafeMutablePointer< UnsafeMutablePointer<Float32>>,构造一个 swift 数组(仅用于 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 中都被打破了!

  • 传递 C 样式 float** 并对其进行初始化的最快捷方式是什么?
  • 在UnsafeMutablePointer&lt; UnsafeMutablePointer&lt;T&gt;&gt; 中分配值的最佳方式是什么?

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

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

注意:Expected use cases Section of UnsafeRawPointer 描述了 C 数组和 C 缓冲区等有用的情况,但是为上述构造转换这些方法并不明显!

【问题讨论】:

    标签: c swift3 unsafemutablepointer


    【解决方案1】:

    这是我最终做的并且正在工作的。它遵循new UnsafeMuTablePointer Reference 的建议,展示了简单方案的示例程序。综上,需要分配和从顶层开始分配每个slot!

    因此,为了构造一个大小为 (size1, size2) 的UnsafeMutablePointer&lt; UnsafeMutablePointer&lt;T&gt;&gt;(如矩阵),您可以使用此处称为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 进行信号处理调用的其他人有用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2017-07-21
      • 2016-04-11
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多