2

Fortran からの C# の呼び出しについて説明しているスタック オーバーフローに関する投稿は見つかりませんでした (Intel Visual Fortran もインストールされた Visual Studio 2010 を使用しています)。ただし、 Fortran からの C/C++ の呼び出しについて説明している (非常に) 限られた数の投稿[ 1、2、3 ]があります。

これらの投稿への回答の 1 つで、Fortran から C++ を呼び出すのは C を呼び出すよりもトリッキーであることが示唆されました。C/C++/C# の基礎が欠けているので、C/C++ 用に作成された手順が C# に適用できるかどうか疑問に思っています。

これらの投稿で気付いた共通点の 1 つは、ISO_C_BINDING という組み込みモジュールが必要であるということです。ここでそれについてもう少し読んだ後、ISO_C_BINDING を使用すると、C# で記述された (DLL としてコンパイルされた) プログラムに 2D 配列に相当する情報を渡し、いくつかの「イベント」を呼び出すことができるかどうかがわかりませんでした。 (関数に似ていますか?)、最後に C# から 2D 配列の情報を取得してから、Fortran での私のビジネスに移ります。

Fortran と C# の両方に精通している場合は、ISO_C_BINDING がそのタスクに適しているかどうか教えてください。上に挙げた情報からは、そのような感覚は得られませんでした。C#と Fortranの間で配列を渡したり、Fortran からC#関数を呼び出したりする実際の例を誰かが持っている場合は、どのように進めるかのテンプレートとしてそれを調べる機会をいただければ幸いです。ありがとう、エリック

4

1 に答える 1

2

Fortran コード:

function TestPass (floatArray) result (iRes)
implicit none
dll_export :: TestPass ! export function name

integer :: Ires
real, intent (in out) :: floatArray

dimension floatArray(5)

iRes = 0 ! Assign function result

open (5,FILE='output.txt')
write (5, 100) floatArray(3)

floatArray(0) = 0.0
floatArray(1) = 1.1
floatArray(2) = 2.2
floatArray(3) = 3.3
floatArray(4) = 4.4

! correct values are written to file here...
open (5,FILE='output.txt')
write (5, 100) floatArray(3)
100 format(5X,'got here',5X,F3.3)
close (5)
end function

C# コード:

static extern int TestPass (
[MarshalAs(UnmanagedType.LPArray, SizeConst=5,
ArraySubType=UnmanagedType.R4)]
float [] yields);

private void BtnTestClick(object sender, System.EventArgs e)
{
float [] floatArray = new float[5] {9.9F, 9.9F, 9.9F, 9.9F, 9.9F};
TestPass(floatArray);

// floatArray.Length == 0 after the function call

for ( int i = 0; i < floatArray.Length; i++ )
Trace.WriteLine(floatArray[i]);
}

このリンクも参照してください。

http://software.intel.com/en-us/articles/calling-fortran-function-or-subroutine-in-dll-from-c-code

それについていくつかの理論を参照することもできます:

http://www.ibiblio.org/pub/languages/fortran/ch2-4.html

于 2013-04-08T05:31:07.317 に答える