C++ Can';t将[[Float]]数组传递到Objective-C++;

C++ Can';t将[[Float]]数组传递到Objective-C++;,c++,arrays,swift,pointers,C++,Arrays,Swift,Pointers,我正在我的应用程序中处理声音。DSP算法是用C++编写的。我需要将数据传递到C++,然后将结果传递到Swift中的音频子系统 为了将数据传递到C++中,我编写了一个Objective-C++类: #define BufferSize 10240 @interface EffectsWrapper : NSObject - (void) processBuffer: (float * _Nonnull *_Nonnull) dataIn ofSize: (int) dataSize into

我正在我的应用程序中处理声音。DSP算法是用
C++
编写的。我需要将数据传递到
C++
,然后将结果传递到
Swift
中的音频子系统

为了将数据传递到
C++
中,我编写了一个
Objective-C++
类:

#define BufferSize 10240

@interface EffectsWrapper : NSObject
-   (void) processBuffer: (float * _Nonnull *_Nonnull) dataIn ofSize: (int) dataSize intoOutputBuffer: (float * _Nonnull *_Nonnull) dataOut;
@end

@implementation EffectsWrapper
-   (void) processBuffer: (float * _Nonnull *_Nonnull) dataIn ofSize: (int) dataSize intoOutputBuffer: (float * _Nonnull *_Nonnull) dataOut
{
    for(int channel = 0; channel < 2; channel ++)
    {
        for(int i = 0; i < dataSize; i ++)
        {
            float data =  dataIn[channel][i];
            dataOut[channel][i] = data;
        }
    }
}
@end
其次,我用数据填充输入数组。然后我调用
EffectsWrapper.process
方法,如下所示:

let dataInPtr = UnsafeMutablePointer(mutating: [UnsafeMutablePointer(mutating: dataIn[0]), UnsafeMutablePointer(mutating: dataIn[1])])
let dataOutPtr = UnsafeMutablePointer(mutating: [UnsafeMutablePointer(mutating: dataOut[0]), UnsafeMutablePointer(mutating: dataOut[1])])
myClass.effectsWrapper.processBuffer(dataInPtr, ofSize: Int32(framesCount), intoOutputBuffer: dataOutPtr)
问题是
EffectsWrapper
中的数据完全是垃圾。有时它甚至会给我一个分配错误。我不明白为什么我创建的指针指向内存中的一些随机位置,而不是我需要它们指向的数组元素


请帮助。

这里的问题是这样的代码

let dataInPtr = UnsafeMutablePointer(mutating: [UnsafeMutablePointer(mutating: dataIn[0]), UnsafeMutablePointer(mutating: dataIn[1])])
使用隐式桥接从数组创建
UnsafePointer
s。这些指针(间接地)保存以供以后使用,这是未定义的行为。请参见和处的
UnsafePointer
unsafemeutablepointer
文档。如前所述

通过实例或对象的隐式桥接创建的指针 数组的元素仅在被调用的 功能。在执行后转义要使用的指针 函数是未定义的行为。特别是,不要使用隐式 调用
UnsafePointer
初始值设定项时桥接


在试图以一种有效的方式解决这个问题之前,应该探索以这样一种方式编写包装器的可能性,即在Swift和包装器之间传递的输入或输出缓冲区是内存中所有通道数据连续存储的区域。这样,缓冲区就不需要被视为指针数组,在Objective-C(++)和Swift之间传递浮点数组就更容易了。

我决定使用1D数组,并将指针传递给使用
运算符的对象
C++
stuff将音频通道视为单独的阵列。工作起来很有魅力。
let dataInPtr = UnsafeMutablePointer(mutating: [UnsafeMutablePointer(mutating: dataIn[0]), UnsafeMutablePointer(mutating: dataIn[1])])