我正在尝试将C#转换为C ++,这是我在Internet上找到的图像的过滤函数,因此我可以编译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#代码翻译C#代码?
非常感谢!!! : - )
答案 0 :(得分:3)
在这种情况下,“depthArrayRowIndex”是lambda函数的输入参数,因此在C ++版本中,您可能想要更改
[&widthBound, &heightBound, &smoothDepthArray] ()
代表
[&widthBound, &heightBound, &smoothDepthArray] (int depthArrayRowIndex)
如果您想进一步阅读有关C#lambda语法的信息,可以使用此链接
http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx
答案 1 :(得分: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
}
确认Foo
的类型为int
。在C ++中,单行lambda可以跳过->Bar
部分。不返回任何内容的Lambda可以跳过->void
。
您可以在C ++ lambda的[]
内列出捕获的参数(如果它们是通过值或引用捕获的),但C#lambdas相当于捕获智能引用隐式使用的所有内容。如果lambda的生命周期限于创建C ++ lambda的范围,[&]
是等效的。
如果它可以持续更长时间,你需要处理lambda捕获的数据的生命周期管理,并且你需要更加小心并且只能按值捕获(并且可能将数据打包到{{1}在捕获shared_ptr
)之前。
答案 2 :(得分:0)
depthArrayRowIndex
基本上是你的(并行)外部for循环的索引变量/值。它将从0
包含到height
独占:
http://msdn.microsoft.com/en-us/library/dd783539.aspx
一个小解释(C#):parallel for的第三个参数是lambda函数,action获取一个Int32参数,它恰好是循环索引。
所以我认为你的C ++翻译应该从以下开始:
concurrency::parallel_for(0, height, ...
代替width
。