【问题标题】:Convert pointer from C++ to C#将指针从 C++ 转换为 C#
【发布时间】:2014-02-20 07:51:36
【问题描述】:

我想将我的代码从 C++ 转换为 C#。 C++ 包含指针,我想将其转换为 C#。

这是 C++ 代码:

void callkernel(int *obsx,int *obsy,int *obsz,int no,int nx,int *x,
    int *y,int *z,int dx,int dy,int dz,double **k)
{
double dxd2 = dx/2;
double dyd2 = dy/2;
double dzd2 = dz/2;

for (int q=0; q < nx;q++)
{
    double xb = x[q]-dxd2; double xa = x[q]+dxd2;
    double yb = y[q]-dyd2; double ya = y[q]+dyd2;
    double zb = z[q]-dzd2; double za = z[q]+dzd2;
    for (int m = 0; m<no; m++)
    {
        double kernel = mk(obsx[m],obsy[m],obsz[m],xb,yb,zb,xa,ya,za);
        k[m][q] = kernel;
    }
}
}

然后它会被调用:

callkernel(obsx,obsy,obsz,no,nx,x,y,z,dx,dy,dz,k);

这是我的 C# 代码:

void callkernel(int[] obsx, int[] obsy, int[] obsz, int no, int nx, int[] x,
    int[] y, int[] z, int dx, int dy, int dz, ref double[][] k)
    {
        double dxd2 = dx / 2;
        double dyd2 = dy / 2;
        double dzd2 = dz / 2;

        for (int q = 0; q < nx; q++)
        {
            double xb = x[q] - dxd2; double xa = x[q] + dxd2;
            double yb = y[q] - dyd2; double ya = y[q] + dyd2;
            double zb = z[q] - dzd2; double za = z[q] + dzd2;
            for (int m = 0; m < no; m++)
            {
                double kernel = mk(obsx[m], obsy[m], obsz[m], xb, yb, zb, xa, ya, za);
                k[m][q] = kernel;
            }
        }
    }

调用者:

callkernel(obsx, obsy, obsz, no, nx, x, y, z, dx, dy, dz, ref k);

它们只是我程序中大代码的一小部分。使用我所做的代码,它似乎有不同的结果。谁能告诉我我的错误在哪里?

【问题讨论】:

  • 你真的应该为你的变量使用更多描述性的名字,这很难阅读
  • 你有一个名为mk的方法(?)。我们还需要查看代码
  • 只是一个提示(不能解决您的问题,但会使代码更易于使用):您不需要将k 传递为ref。数组内容默认通过引用传递。请参阅stackoverflow.com/a/967413/789683 了解更多信息
  • 您能告诉我们 c++ 代码的示例结果和 c# one 的结果吗?我的第一个猜测是 mk 函数会有所作为。 @flipchart 我认为 ref 的使用具有适当的意义,因为它强制开发人员为 k 赋值,对于这么多参数来说是合理的:-)
  • mk 可能是问题所在。 double[][] k 之前的 ref 毫无意义,但代码在功能上是相同的。这意味着问题的唯一位置可能是mk。我会通过为其编写单元测试来检查mk 是否提供了您期望的结果。您对将指针转换为 C# 代码的基本理解是正确的。

标签: c# c++ arrays pointers


【解决方案1】:

我已经得到了答案。它是由另一种方法引起的。转换效果很好。顺便说一句,谢谢你的回答。它补充了我对指针的理解。感谢您的宝贵时间。

Ps:我想为答案投票,但不知道该怎么做。

【讨论】:

    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 2021-09-20
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多