1

我正在为 Windows Phone 8 编写代码,并且正在尝试了解跨越 C#/C++ 代码障碍的来龙去脉。

假设我在 C# 端有两个数组,float[]我们将它们称为. 我想对它们进行逐个元素的添加。由于这是在实时系统中,(音频处理)我不想冒险在我的音频处理例程中进行分配和释放,所以我想要一些类似. 由于我明确地学习如何从 C# 调用 C++,所以我不会只用 C# 编写 for 循环,我会用 C++ 编写它,如下所示:data1data2data1[i] += data2[i]

void LibFilter::mixIn( Platform::Array<float>^ * data1, const Platform::Array<float>^ data2 ) {
    auto outArray = (*data1);

    // Don't do anything if we don't have matching lengths
    if( data2->Length != outArray->Length )
        return;

    // Sum data2 into outArray (which is just a dereferenced data1)
    for( unsigned int i=0; i<outArray->Length; ++i ) {
        outArray[i] += data2[i];
    }
}

这似乎对我有用,但话又说回来,我是 C++ 程序员,而不是 C# 程序员,显然这应该与outC# 中的关键字一起使用,这意味着它data1是一个空指针,无论传递的值如何在。我相信我想改用ref关键字,但我不知道如何使用 Windows Phone 8 SDK 来做到这一点。

关于如何在ref此处使用关键字或如何最好地构建它的建议将不胜感激,因为我仍在学习 C# 的最佳实践。谢谢你们!

编辑:错误信息

如果我只是尝试libfilter.mixIn( ref data1, data2 );从我的 C# 代码中使用,我会得到以下信息:

error CS1502: The best overloaded method match for 'libfilter.LibFilter.mixIn(out float[], float[])' has some invalid arguments
error CS1620: Argument 1 must be passed with the 'out' keyword
4

1 回答 1

1

根据您的编辑,C++/CX 编译器为该方法生成的元数据似乎使用out关键字,而不是ref关键字。

无论如何,我根本不明白为什么您需要通过引用传递。Platform::Array 是可变的,所以即使它是按值传递的,你也可以修改它。以下 MSDN 文章有一个与您的代码类似的示例(请参阅“填充数组”部分):

http://msdn.microsoft.com/en-us/library/windows/apps/hh700131.aspx

于 2013-01-04T01:06:55.250 回答