我正在尝试使用以下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。
这里发生了什么以及如何解决?
答案 0 :(得分:2)
多维数组存储在.net中的主要行和Fortran中的col主要行。这解释了这种行为。
为了解决不匹配问题,您需要转置数据。您可以选择在.net端或Fortran端的任意一侧执行此操作。但你无法用任何一种语言为你做这件事。
在C#侧,例如,数组的维数为m乘n,分配维数为n的维数。将元素i,j从原始数组复制到副本的元素j,i。然后将副本传递给Fortran代码。