2016-06-16 3 views
0

私は、次のDLLIMPORT文を使用して、FortranのDLLに配列を渡すしようとしています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); 

私は次の配列

を渡すと、それはこの

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

のように見えます呼び出す私のC#コード

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)は、22ではなく12に等しくなければなりません。

ここでは何が起こっているのですか?

+0

数字は切り替えられた位置にあります。つまり、A(1,2)は12でなく22でなければなりません。 – PlTaylor

+0

'A(1,2)'は、形状[ 2]。 – francescalus

+0

私はあなたのFortranコード –

答えて

2

多次元配列は、Fortranの.netとcol majorに格納されています。それはその行動を説明します。

ミスマッチを解決するには、データを転置する必要があります。どちらの側でも、.net側またはFortran側でこれを行うことができます。しかし、どちらの言語もあなたのためにすることはできません。

C#側では、たとえば配列の次元がm by nの場合、次元nの配列がmで割り当てられます。要素i、jを元の配列から要素j、iにコピーする。次に、コピーをFortranコードに渡します。

関連する問題