Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用DLLImport将数组传递给Fortran DLL,而不会在传递过程中损坏它?_C#_Arrays_Fortran_Pinvoke_Dllimport - Fatal编程技术网

C# 如何使用DLLImport将数组传递给Fortran DLL,而不会在传递过程中损坏它?

C# 如何使用DLLImport将数组传递给Fortran DLL,而不会在传递过程中损坏它?,c#,arrays,fortran,pinvoke,dllimport,C#,Arrays,Fortran,Pinvoke,Dllimport,我试图使用以下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[,] aTranspose

我试图使用以下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中的row major和Fortran中的col major中。这就解释了这种行为

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


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

多维数组存储在.net中的row-major和Fortran中的col-major中。这就解释了这种行为

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


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

数字处于切换位置。。。i、 e.A(1,2)应该等于12而不是22。
A(1,2)
是数组的第四个元素
A
的形状
[3,2]
。我们看不到您的Fortrancode@DavidHeffernan我的fortran代码只是打印出数组,什么都没有weird@francescalus我相信这就是问题所在,在C(#)世界中,我的理解是,a(1,2)是第二项,不是第四项。数字处于切换位置。。。i、 e.A(1,2)应该等于12而不是22。
A(1,2)
是数组的第四个元素
A
的形状
[3,2]
。我们看不到您的Fortrancode@DavidHeffernan我的fortran代码只是打印出数组,什么都没有weird@francescalus我相信这就是问题所在,在C(#)世界中,我的理解是,a(1,2)是第二项,不是第四项。