0

Swift 3 内で、入力を受け入れる C オブジェクトにデータを送信する必要がありfloat **ます。

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スタイルを渡して初期化する最も迅速な方法は何ですか?
  • に値を割り当てる最良の方法は何UnsafeMutablePointer< UnsafeMutablePointer<T>>ですか?

ドキュメンテーションには、 forT **を使用する必要があると書かれていますAutoreleasingUnsafeMutablePointer<T>が、実際に作成することはできませんでした!

上記の例では、配列は実際には気にしないことに注意してください。既知の容量を使用して Pointer を直接初期化できれば、そうします。

: UnsafeRawPointer の予期されるユース ケース セクションでは、 C 配列や C バッファーなどの便利な状況について説明していますが、上記の構造のそのようなメソッドを変換することは明らかではありません!

4

1 に答える 1

2

これが私がやったことであり、働いています。これは、単純なスキームのサンプル プログラムを示す新しい UnsafeMuTablePointer リファレンスの推奨に従っています。要約すると、最上位から各スロットを割り当て割り当てる必要があります。

したがって、サイズ (size1, size2) の (行列のような) を構築するために、UnsafeMutablePointer< UnsafeMutablePointer<T>>ここで と呼ばれる中間ベクトルを使用して、次のように進めることができます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++ で信号処理呼び出しを使用して迅速に使用しようとしている他のユーザーに役立つことを願っています!

于 2016-10-19T15:16:38.273 に答える