使用C ++ / CLI包装器

时间:2018-03-06 10:13:53

标签: c# c++ arrays c++-cli wrapper

我正在一个需要优化的项目中工作,我想将C#的一部分代码翻译成C ++。我使用的是C ++ \ CLI包装器,但我对这种方法很新,我还没有完全理解它。以下代码在运行程序时返回错误,但我不知道原因。

C#程序如下:

int[,] Arr = new int[5, 5];

        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                Arr[i, j] = i + j;
            }
        }

test.MatrixComputation(Arr, Arr.GetLength(0));

C ++ / CLI项目如下:

void MatrixComputation(cli::array<int, 2> ^arr, int size)
    {
        pin_ptr<int> p_arr = &arr[0, 0];
        pu -> ChangeArray((int**)p_arr, size);
    }

非托管C ++代码:

void Unmanaged::MatrixComputation(int** arr, int size)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            arr[i][j] = i + j;     // line 27
        }
    }

    std::cout << arr[2][2] << std::endl;
}

它编译得很好,但是当我运行它时,我收到以下错误:

*Line 27: System.NullReferenceException: Object reference not set to an instance of an object*

投射到双指针是一个糟糕的策略,但它是我脑海中唯一的东西。另外,我知道C ++没有像C#那样拥有2D数组,但我需要C#中的多维数组,我不能改变它来编写锯齿状数组Arr [] []。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您应该将托管数组复制到非托管数组,然后执行计算:

void MatrixComputation(cli::array<int, 2> ^arr, int size)
{
    std::unique_ptr<int[]> myArray(new int[size * size]);
    for (auto y = 0; y < size; y++)
    {
        for (auto x = 0; x < size; x++)
        {
            myArray[y * size + x] = arr[x, y];
        }
    }

    pu -> ChangeArray(std::move(myArray), size);
}

void Unmanaged::MatrixComputation(std::unique_ptr<int[]> arr, int size)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            arr[i * size + j] = i + j;
        }
    }

    std::cout << arr[2 * size + 2] << std::endl;
}