【发布时间】:2020-04-15 03:21:18
【问题描述】:
我想将 C# 中的二维数组作为参数传递给 C++ DLL 中的函数(它必须是 C++,因为我使用的是 CUDA C++)。我尝试了很多东西,但未能使用数组或向量直接传递它。我唯一能做的就是将其转换为一维数组,将其连同其维度一起传递给函数,然后将其转换回二维向量。 这是 C++ DLL 代码:
int Add(int* a, int m, int n)
{
int i, j, ans;
vector<vector<int>> A(m, vector<int>(n));
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
A[i][j] = a[i * n + j];
// Main calculations
return ans;
}
这是传递数组的 C# 代码:
[DllImport("CUDALib.dll")]
static extern int Add(int[] a, int m, int n);
private void PassArray(int[,] A)
{
int i, j, m, n, ans;
int[] a;
m = A.GetLength(0);
n = A.GetLength(1);
a = new int[m * n];
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
a[i * n + j] = A[i, j];
ans = Add(a, m, n);
}
我有什么更快、更有效、更直接的方法吗?
【问题讨论】:
-
以一维数组的形式传递既好又高效,但将其转换为
vector<vector<T>>会产生大量的堆分配和取消分配。将其保持为 1D 形式,并创建一个您可以使用 2 维访问的类,如果您需要清晰的话。 -
“可以二维访问的类”是什么意思?
-
我发布了一个答案,展示了一种非常有效的方法,它使用标准的
[n][m]方法来访问数组元素。