将C++中涉及数组的函数调用转换为C#时出现问题

Trouble with converting function calls involving arrays in C++ to C#

本文关键字:问题 转换 函数调用 C++ 数组      更新时间:2023-10-16

我需要将以下C++代码转换为C#。我不知道给我的是哪个C++版本。我使用了Tangible Software的转换器,将C++的方法一个接一个地转换为C#。这个Multiply1x3方法是从两个地方调用的,如下所示,在转换成C#后给我带来了一些麻烦。你能告诉我哪里出了问题吗?

void Conversions::Multiply1x3(double matr[3], double matr3[3][3], double result[3])
{
    int i;
    for (i = 0; i < 3; i++)
    {
        result[i] = matr[0] * matr3[0][i] + matr[1] * matr3[1][i] + matr[2] * matr3[2][i];
    }
}
void Conversions::SomeMethod2(double matr1[3][3], double matr2[3][3], double result[3][3])
{
    double tempArray[3];
    for (i = 0; i < 3; i++) 
    {
        Multiply1x3(tempArray, matr2, result[i]);
    }
}
void Conversions::SomeMethod2() 
{
    double matr[3][3];
    double source[3];
    double NewX[3];
    Multiply1x3(source, matr, NewX);
}

转换后我得到以下C#代码:

public partial class Conversions
{
    public void Multiply1x3(double[] matr, double[,] matr3, double[] result)
    {
        int i;
        for (i = 0; i < 3; i++)
        {
            result[i] = matr[0] * matr3[0, i] + matr[1] * matr3[1, i] + matr[2] * matr3[2, i];
        }
    }
    public void SomeMethod2(double[,] matr1, double[,] matr2, double[,] result)
    {
        double[] tempArray = new double[3];
        for (i = 0; i < 3; i++)
        {
            Multiply1x3(tempArray, matr2, result[i]); // ERROR
        }
    }
    public void SomeMethod2()
    {
        double[,] matr = new double[3, 3];
        double[] source = new double[3];
        double[] NewX = new double[3];
        Multiply1x3(source, matr, NewX);
    }
}

编译这个C#代码会给我以下错误,所有3个错误都来自同一行:

Argument 3: cannot convert from 'double' to 'double[]'
Wrong number of indices inside []; expected 2
The best overloaded method match for 'Project.Conversions.Multiply1x3(double[], double[*,*], double[])' has some invalid arguments

问题是C#不支持访问多维数组的切片;即,从二维数组result中,您正试图通过result[i]获得对第i行的引用,但C#根本不支持此操作。一种解决方法是使用交错数组类型double[][]来代替多维数组类型double[,]

Multiply1x3采用double[]:

(..., double[,] matr3, double[] result)
//                     ^^^^^^^^^^^^^^^

但您传递了一个double,因为result[i]返回了一个double。