2010-12-08 36 views
3

我想问你通过C函数调用fortran函数的帮助。这些C函数将通过cython在python代码中使用。把东西放在一起,我有这样的计划:Cython,C和Fortran

Cython Module - > C函数 - > Fortran,其中 - >表示“调用”。

目前我设法从cython调用C函数,但是我很难调用fortran函数。你能帮助我吗?(一个简单的例子会很棒)。

在此先感谢。 编辑: 我使用的是gcc 4.1.2。和gfortran

+0

更准确的答案可能需要知道您所问的特定C和Fortran编译器。 – SingleNegationElimination 2010-12-08 02:46:57

+0

已编辑。对不起,我忘了:) – nunolourenco 2010-12-08 02:50:55

+0

您是否知道[fwrap](https://github.com/kwmsmith/fwrap)? – ephemient 2010-12-08 03:23:19

回答

7

第一个答案中的链接描述过时的方法。从C语言调用Fortran或从Fortran语言调用C语言变得更加容易,并增加了ISO C绑定到Fortran。使用Fortran语言功能指示Fortran编译器发出与C二进制兼容的可执行代码。程序员不必“破解”连接,因为它是编译器和平台独立的语言的一部分。从技术上讲,ISO C Binding是Fortran 2003的一部分,但它已经在众多编译器中使用了好几年,例如自4.3版以来的gfortran和Intel ifort。

要从C中调用Fortran子例程或函数,需要使用bind C选项声明Fortran子例程或函数,并使用绑定中为参数声明提供的C兼容类型。在“混合语言编程”下的gfortran手册中有一些例子。由于ISO C绑定是该语言的一部分,因此手册的这一部分主要是与编译器无关的。在Stack Overflow和网络上的其他地方,以前的答案中还有其他例子。

这里是一个子程序的一个Fortran子程序声明的快速代码片段(未测试的)被选自C称为:

subroutine test (varint1, varflt2) bind (C, name="MyTest") 

    use iso_c_binding 

    integer (kind=c_int32_t), intent (in) :: varint1 
    real (kind=c_float), intent (out) :: varflt2 

绑定Ç名“MyTest的”覆盖的Fortran名称 - 它是区分敏感,不像Fortran。无需担心下划线!变量类型应该是显而易见的...请参阅gfortran手册或其他地方提供什么。

1

有一个叫做fwrap的自动化工具,它生成C,cython和python绑定到fortran例程。我认为它仍然处于测试版状态,但您可能会发现它很有帮助,链接是here