我是一名 C 程序员,必须通过添加对 C 函数的单个调用来更新庞大的 Fortran 2003 程序。
首先,我需要编写一个最小的 Fortran 包装器(在现代、自由格式的 Fortran 中,不要大喊大叫),它将正确调用 C 函数,其中包含一个包含循环计数器(以及日期/时间,如果可能的话)的字符串,从内部一个循环。
这应该很“容易”,但我所做的搜索都没有产生足够的片段让我创建一个工作程序。
我正在使用最新的 64 位版本的 gfortran 和 64 位 Linux 下的 Intel ifort 编译器,测试代码需要使用这两个编译器进行编译。
这是文件 send_to_port.c 中的 C 定义:
int send_to_port(int port, char *data, unsigned int length);
添加最后一个参数是为了让 Fortran 不必担心尾随的 null(我在 C 中处理它:data[length] = '\0';)。我知道长度参数是由 Fortran “自动”添加的,因此 Fortran 调用将只有两个参数,整数端口号和要发送的字符串。
我希望使用以下 gfortran 行以及 ifort 的等效代码来编译代码:
gfortran -ffree-form test.f -o test send_to_port.o
我正在寻找最少的代码:我认为它应该在 10-20 行左右,但我不知道 Fortran。这是我当前的 test.f 编辑缓冲区(无法编译):
use iso_c_binding
use iso_fortran_env, stdout => output_unit
implicit none
! Fortran interface to C routine:
! int send_to_port(int port, char *data, unsigned int length);
interface
integter(c_int) function send_to_port(port, data) bind(C)
integer(c_int), value :: port
character(kind=c_char) :: data(*)
end interface
integer(c_int) retval, cnt, port
character(1024) str
cnt = 0
port = 5900
do ! Infinite loop (^C to exit)
call fdate(date)
cnt = cnt + 1
write(str, "(A,A,I8)") date, ": Iteration = ", cnt
write(stdout, *) str ! Show what's about to be sent
retval = send_to_port(port, str) ! Send it
write(stdout, *) retval ! Show result
call sleep(1)
end do
end
帮助?