在 Swift 4 中,我正在创建一个 DSPSplitComplex 以在 vDSP_fft_zip() 中使用,但下次我创建另一个 DSPSplitComplex 时它会立即被覆盖。
(DSPSplitComplex结构有2个UnsafeMutablePointer<Float>
)
//--Create the DSPSplitComplex
var A = [Float](repeating:0, count:32);
var B = [Float](repeating:0, count:32)
var splitComplex1 = DSPSplitComplex(realp: &A, imagp: &B)
//--Perform fft
log2Size = vDSP_Length(log2f(Float(32)))
setupFFT = vDSP_create_fftsetup(log2Size, FFTRadix(FFT_RADIX2))!;
vDSP_fft_zip(setupFFT, & splitComplex1, 1, log2Size, FFTDirection(FFT_FORWARD));
//--Create another DSPSplitComplex
var C = [Float](repeating:0, count:32);
var D = [Float](repeating:0, count:32)
var splitComplex2 = DSPSplitComplex(realp: &C, imagp: &D)
我现在可以在调试器中看到 UnsafeMutablePointer 的splitComplex2.realp
地址与 相同splitComplex1.realp
,因此我对 splitComplex2 所做的任何事情都会覆盖 splitComplex1
我猜线索可能在标题“不安全”中,但如果它实际上不可用,那么存储返回的 DSPSplitComplex 内容的正确策略是什么?
我想从它们创建新的 [Float] 数组是制作永久副本的一种方式
let arrary = Array(UnsafeBufferPointer(start: splitComplex1.realp, count: 32))
...但似乎,尽管阅读了 Swift 文档,但我仍然误解了 UnsafeMutablePointer 的观点,为什么 vDSP_fft_zip() 会返回一些从一开始就无法使用的东西?