代码之家  ›  专栏  ›  技术社区  ›  sfandres94

使用C++/CLI包装器将2D数组从C#传递到非托管C++

  •  0
  • sfandres94  · 技术社区  · 6 年前

    我在一个需要优化的项目中工作,我想将代码的一部分从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 回复  |  直到 6 年前
        1
  •  1
  •   kfazi    6 年前

    应将托管阵列复制到非托管阵列,然后进行计算:

    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;
    }