如何使用 DLLImport 将数组传递给 Fortran DLL 而不会在此过程中对其进行破坏?
How to Pass an Array to a Fortran DLL using DLLImport without mangling it in the process?
我正在尝试使用以下 DLLImport 语句将数组传递到 Fortran DLL
[DllImport("MyFortranDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern void sDTransposeSTDCALL(ref int n1, ref int n2, [In]double[,] doubles, [Out]double[,] aTransposed);
调用它的我的 C# 代码如下所示
public double[,] TransposeStd(double[,] a)
{
int n1 = a.GetLength(0);
int n2 = a.GetLength(1);
double[,] aTransposed = new double[n2, n1];
sDTransposeSTDCALL(ref n1, ref n2, a, aTransposed);
return aTransposed;
}
当我传递以下数组时
var a = new double[,] { { 11, 12 }, { 21, 22 }, { 31, 32 } };
我让 fortran DLL 打印出一个文本文件,其中包含它对数组的解释,并打印出这个
A( 1, 1 ) = 11.000
A( 1, 2 ) = 22.000
A( 2, 1 ) = 12.000
A( 2, 2 ) = 31.000
A( 3, 1 ) = 21.000
A( 3, 2 ) = 32.000
但是,这些数字的位置互换了。例如 A(1,2)
应该等于 12 而不是 22。
这是怎么回事,我该如何解决?
多维数组在.net中以行为主,在Fortran以列为主。这就解释了这种行为。
为了解决不匹配问题,您需要转置数据。您可以选择在任一端执行此操作,在 .net 端或 Fortran 端。但是你不能让任何一种语言为你做这件事。
在 C# 端,例如数组的维度为 m x n,分配一个维度为 n x m 的数组。将元素 i, j 从原始数组复制到副本的元素 j, i 。然后将副本传递给 Fortran 代码。
我正在尝试使用以下 DLLImport 语句将数组传递到 Fortran DLL
[DllImport("MyFortranDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern void sDTransposeSTDCALL(ref int n1, ref int n2, [In]double[,] doubles, [Out]double[,] aTransposed);
调用它的我的 C# 代码如下所示
public double[,] TransposeStd(double[,] a)
{
int n1 = a.GetLength(0);
int n2 = a.GetLength(1);
double[,] aTransposed = new double[n2, n1];
sDTransposeSTDCALL(ref n1, ref n2, a, aTransposed);
return aTransposed;
}
当我传递以下数组时
var a = new double[,] { { 11, 12 }, { 21, 22 }, { 31, 32 } };
我让 fortran DLL 打印出一个文本文件,其中包含它对数组的解释,并打印出这个
A( 1, 1 ) = 11.000
A( 1, 2 ) = 22.000
A( 2, 1 ) = 12.000
A( 2, 2 ) = 31.000
A( 3, 1 ) = 21.000
A( 3, 2 ) = 32.000
但是,这些数字的位置互换了。例如 A(1,2)
应该等于 12 而不是 22。
这是怎么回事,我该如何解决?
多维数组在.net中以行为主,在Fortran以列为主。这就解释了这种行为。
为了解决不匹配问题,您需要转置数据。您可以选择在任一端执行此操作,在 .net 端或 Fortran 端。但是你不能让任何一种语言为你做这件事。
在 C# 端,例如数组的维度为 m x n,分配一个维度为 n x m 的数组。将元素 i, j 从原始数组复制到副本的元素 j, i 。然后将副本传递给 Fortran 代码。