如何使用DLLImport将数组传递给Fortran DLL而不在其中进行修改?

时间:2016-06-16 19:51:49

标签: c# arrays fortran pinvoke dllimport

我正在尝试使用以下DLLImport语句将数组传递给Fortran DLL

void Calibrate::init(){
 Automatic::config();
}

调用它的我的C#代码看起来像这样

[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);

当我传递以下数组时

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

我有fortran DLL打印出一个文本文件,其中包含解释数组的内容并打印出来

var a = new double[,] { { 11, 12 }, { 21, 22 }, { 31, 32 } };

但是,这些数字处于切换位置。例如, 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 应该等于12而不是22。

这里发生了什么以及如何解决?

1 个答案:

答案 0 :(得分:2)

多维数组存储在.net中的主要行和Fortran中的col主要行。这解释了这种行为。

为了解决不匹配问题,您需要转置数据。您可以选择在.net端或Fortran端的任意一侧执行此操作。但你无法用任何一种语言为你做这件事。

在C#侧,例如,数组的维数为m乘n,分配维数为n的维数。将元素i,j从原始数组复制到副本的元素j,i。然后将副本传递给Fortran代码。