使用 C++/CLI 包装器将二维数组从 C# 传递到非托管 C++
passing 2D array from C# to unmanaged C++ using C++/CLI wrapper
我在一个需要优化的项目中工作,我想将一部分代码从 C# 转换为 C++。我正在使用 C++\CLI 包装器,但我对这种方法真的很陌生,我还没有完全理解它。下面的代码returns在我运行程序的时候出错了,我也不知道是什么原因。
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# 那样的二维数组,但我需要 C# 中的多维数组,我不能更改它来编写锯齿状数组 Arr[][].
提前致谢。
您应该将托管数组复制到非托管数组,然后进行计算:
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;
}
我在一个需要优化的项目中工作,我想将一部分代码从 C# 转换为 C++。我正在使用 C++\CLI 包装器,但我对这种方法真的很陌生,我还没有完全理解它。下面的代码returns在我运行程序的时候出错了,我也不知道是什么原因。
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# 那样的二维数组,但我需要 C# 中的多维数组,我不能更改它来编写锯齿状数组 Arr[][].
提前致谢。
您应该将托管数组复制到非托管数组,然后进行计算:
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;
}