如何使用 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 代码。