1

我被困在 C 代码中的递归函数上(我没有编写 C 代码)。这是我正在转换的片段:

int makeroad(float x1, float y1, float x2, float y2, float var, float X[], float Y[], float prec)
{
//stuff
k+=makeroad(x,y,x2,y2,var,X+k,Y+k,prec);
}

我不完全确定这是在做什么。这是 C 代码中唯一具有该名称的函数,因此它不是重载问题。当它递归调用自身时,它会将 k 添加到 X 和 Y 数组中。把它放在 C# 中看起来像这样:

int makeroad (float x1, float y1, float x2, float y2, float var, float[] X, float[] Y, float prec)
    {
      //stuff
      k += makeroad(x, y, x2, y2, var, X + k, Y + k, prec);
    }

Visual Studio 告诉我 X + k 和 Y + k 无效。原始 C 代码在 Visual C++ Express 2010 中编译并运行良好。我不认为大写和小写 x 和 y 变量分别存在混淆。如果有的话,代码是靠运气工作的。

有任何想法吗?

4

3 回答 3

0

数组在 C 中通过引用传递,所以实际传递的是指向数组开头的指针。当您传递例如“X + k”时,您正在传递一个指向从 k 开始的子数组的指针。

我不知道 C# 对数组参数做了什么,我也不想。

于 2010-12-29T23:27:53.117 回答
0

array+k在 C 中,您可以通过将指针传递给第 k 个项目(即new” 数组根本不是新的,因为它会引用“原始”数组的相同元素)。

在 C# 中,这是行不通的,因为数组不只是作为指向连续内存的指针来处理;如果您想要快速修复,您可以创建一个新数组,将元素从第 k 个复制到末尾,Array.Copy然后将这个新数组传递给递归函数,但这很慢并且如果算法修改则不起作用数组的元素(修改不会反映在其他数组中,因为它们现在是副本)。

更好的解决方案是将数组按k原样作为参数传递,并使例程从该位置开始使用数组。您应该实现相同的行为而不会受到严重的速度惩罚。

于 2010-12-29T23:32:19.530 回答
0

X + k 和 Y + k 是指向数组的指针。它允许您“跳过”被调用函数中数组开头的部分。

您可以将 C 代码与其他 CLR 代码混合使用,因此您实际上不必进行转换。

如果你真的觉得你需要,你可以考虑只传递 X、Y 和 k 并重写“东西”以使用 k 作为 X 和 Y 的开始偏移量。作者在这种情况下非常有效地使用 C,这使得它变得困难移植到另一种语言。

于 2010-12-29T23:33:37.437 回答