0

我正在尝试将我在 Internet 上找到的图像的过滤功能从 C# 转换为 C++,这样我就可以编译一个 DLL 并在我的项目中使用它。原始的 C# 代码是:

    Parallel.For(0, height, depthArrayRowIndex => {
        for (int depthArrayColumnIndex = 0; depthArrayColumnIndex < width; depthArrayColumnIndex++) {
            var depthIndex = depthArrayColumnIndex + (depthArrayRowIndex * width);
            .
            .
            .
            ... other stuff ...
    }

我的问题的第一部分是:如何

    depthArrayRowIndex => {

作品?有什么意义depthArrayRowIndex

    var depthIndex = depthArrayColumnIndex + (depthArrayRowIndex * width);

这是我的 C++ 翻译:

    concurrency::parallel_for(0, width, [&widthBound, &heightBound, &smoothDepthArray] () {
        for (int depthArrayColumnIndex = 0; depthArrayColumnIndex < width; depthArrayColumnIndex++) {
            int depthIndex = depthArrayColumnIndex + (depthArrayRowIndex * width);
            .
            .
            .
            ... other stuff ...
    }

但显然这里depthArrayRowIndex没有任何意义。如何将 C# 代码转换为 C++ 中的工作代码?

非常非常感谢你 !!!:-)

4

3 回答 3

3

在这种情况下,“depthArrayRowIndex”是 lambda 函数的输入参数,因此在您的 C++ 版本中,您可能需要更改

[&widthBound, &heightBound, &smoothDepthArray] () 

为了

[&widthBound, &heightBound, &smoothDepthArray] (int depthArrayRowIndex)

如果您想进一步了解 C# lambda 语法,此链接可能很有用

http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx

于 2013-06-25T15:04:43.157 回答
1
Foo => {
  // code
  return bar; // bar is of type Bar
}

是相同的

(Foo) => {
  // code
  return bar; // bar is of type Bar
}

把它翻译成 C++ 做

[&](int Foo)->Bar {
  // code
  return bar; // bar is of type Bar
}

assmingFoo是类型int。在 C++ 中,单行 lambda 可以->Bar跳过该部分。不返回任何内容的 Lambda 可以->void跳过。

您可以在 C++ lambda 中列出捕获的参数(如果它们是通过值或引用捕获的)[],但 C# lambda 等效于捕获智能引用隐式使用的所有内容。如果您的 lambda 的生命周期仅限于创建 C++ lambda 的范围,[&]则等效。

如果它可以持续更长时间,您需要处理 lambda 捕获的数据的生命周期管理,并且您需要更加小心,并且只按值捕获(并且可能shared_ptr在捕获之前将数据打包shared_ptr)。

于 2013-06-25T15:32:11.893 回答
0

depthArrayRowIndex基本上将是您的(并行)外部 for 循环的索引变量/值。它将从0包容性变为height独占性:

http://msdn.microsoft.com/en-us/library/dd783539.aspx

一点解释(C#):parallel for 的整个第三个参数是 lambda 函数,动作得到一个 Int32 参数,它恰好是循环索引。

所以我认为你的 C++ 翻译应该以: concurrency::parallel_for(0, height, ...而不是width.

于 2013-06-25T15:17:50.523 回答