【问题标题】:ref keyword with C++/CLI code interface带有 C++/CLI 代码接口的 ref 关键字
【发布时间】:2013-01-04 09:06:55
【问题描述】:

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

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

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# 程序员,显然这应该与 C# 中的 out 关键字一起使用,这意味着 data1 是一个空指针,无论传入的值如何。我相信我想改用 ref 关键字,但我不知道如何使用 Windows Phone 8 SDK 来做到这一点。

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

编辑:错误信息

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

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

【问题讨论】:

  • 使用 ref 关键字有什么不明白的地方?你试过了吗,它失败了?你得到什么错误?
  • 我已经用更多信息更新了问题

标签: windows-phone-8 c++-cx


【解决方案1】:

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

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

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

【讨论】:

  • Platform::Array 不可变,因为它们必须以 const ArrayArray *WriteOnlyArray 的形式传递。在第一种和第三种情况下,我无法修改元素,在第二种情况下,数组未初始化。这就是为什么我在寻找与 ref 关键字等效的原因,因为显然 WinRT 只支持 inout
  • 嗯,MSDN 示例使用 WriteOnlyArray 来做你想做的事。
  • 不,它没有。在示例中,arr 的值仅被分配给,从不被读取。我想使用+=,而不仅仅是=
猜你喜欢
  • 2014-02-19
  • 2010-10-28
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 2014-11-21
  • 2011-02-17
  • 2012-08-17
相关资源
最近更新 更多