gpt4 book ai didi

从 C 调用 FORTRAN 子程序

转载 作者:太空狗 更新时间:2023-10-29 16:37:30 30 4
gpt4 key购买 nike

我正在尝试从 C 调用 FORTRAN 函数

我的问题是:

  1. 如果 fortRoutine 是我的 fortran 子例程的名称,那么我从 C 调用它作为 fortRoutine_。如果 fortRoutine 只包含一个字符数组参数,那么我可以这样传递吗:

    fortRoutine_("I am in fortran");
  2. 在调用 FORTRAN 子程序时,什么时候应该使用值传递,什么时候应该使用引用传递?

因为我是 C 的新手,所以我对此一无所知。如果可能,请同时推荐一些好的教程链接。

最佳答案

现在执行此操作的方法是在 Fortran 端使用 Fortran ISO C 绑定(bind)。这是 Fortran 2003 语言标准的一部分,可用于许多编译器;它不是特定于 gcc 的。它已在本网站的许多答案中进行了描述。作为语言标准的一部分,它独立于编译器和平台。而且您不需要了解编译器的内部传递约定。 ISO C 绑定(bind)在 Fortran 子例程或函数的声明中使用时,会导致 Fortran 编译器使用 C 调用约定,以便可以直接从 C 调用该过程。您不需要添加隐藏参数或名称 mangle Fortran 子例程名称,即没有下划线。链接器使用的名称来自“绑定(bind)”选项。

字符串是一个难题,因为从技术上讲,在 C 中它们是字符数组,您必须在 Fortran 中匹配它。您还必须处理字符串的不同定义:C 以 null 结尾,Fortran 固定长度并用空格填充。该示例显示了这是如何工作的。数字更容易。数组的唯一问题是 C 是行优先的,而 Fortran 是列优先的,因此多维数组是转置的。

int main ( void ) {

char test [10] = "abcd";

myfortsub (test);

return 0;

}

subroutine myfortsub ( input_string ) bind ( C, name="myfortsub" )

use iso_c_binding, only: C_CHAR, c_null_char
implicit none

character (kind=c_char, len=1), dimension (10), intent (in) :: input_string
character (len=10) :: regular_string
integer :: i

regular_string = " "
loop_string: do i=1, 10
if ( input_string (i) == c_null_char ) then
exit loop_string
else
regular_string (i:i) = input_string (i)
end if
end do loop_string

write (*, *) ">", trim (regular_string), "<", len_trim (regular_string)

return

end subroutine myfortsub

您将 C 语言编译为目标文件并使用 gfortran 编译 fortran 语言并将两者链接起来:

gcc-mp-4.6   \
-c \
test_fortsub.c

gfortran-mp-4.6 \
test_fortsub.o \
myfortsub.f90 \
-o test_fortsub.exe

输出是:

 >abcd<           4

关于从 C 调用 FORTRAN 子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8207997/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com