2

我没有在 Stack Overflow 上找到任何讨论从 Fortran 调用 C# 的帖子(我正在使用装有 Intel Visual Fortran 的 Visual Studio 2010)。但是,讨论从 fortran 调用 C/C++的帖子数量(非常)有限[1 , 2 , 3 ]。

在对这些帖子的其中一个回复中,有人建议从 Fortran 调用 C++ 比调用 C 更棘手,这让我怀疑 C# 可能更棘手?由于缺乏 C/C++/C# 基础,我想知道为 C/C++ 制定的程序是否适用于 C#?

我在这些帖子中注意到的一个共同点是需要名为 ISO_C_BINDING 的内部模块。在这里阅读了更多关于它的信息后,我不清楚 ISO_C_BINDING 是否允许我将几个二维数组的信息传递给用 C# 编写的程序(编译为 DLL),调用一些“事件” (类似于函数?),最后从 C# 中取回一个二维信息数组,然后继续我在 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 回答