我在这里找到了 Fortran 的 Xlib 接口。当我运行简单的 C 代码(创建 X 窗口)时,一切正常。但最简单的 Fortran 代码失败了。
use xlib
type(c_ptr) display
display = x_open_display_test('') <----------------infinite loop
! display = x_open_display('') <---------------- returns NULL
if(.not. c_associated(display)) then
write(6, 901)
stop
end if
901 format('Display is NULL?')
end program simple
我修改了 Xlib.f90 中的接口来尝试调试,但事情却以光速的速度变得糟糕起来:
:
public :: x_open_display
:
interface
:
! Display *XOpenDisplay (char *display_name)
function x_open_display(display_name) bind(c, name='XOpenDisplay')
import :: c_char, c_ptr
implicit none
character(kind=c_char), intent(in) :: display_name
type(c_ptr) :: x_open_display
end function x_open_display
:
end interface
:
function x_open_display_test(display_name) bind(c, name='XOpenDisplay')
character(kind=c_char), intent(in) :: display_name
type(c_ptr) :: x_open_display_test
x_open_display_test = x_open_display(display_name)
write (6, 95)
95 format('xopen')
end function x_open_display_test
我不但失败了,还得到了 15,000 多行“xopen”和一个段错误。
如果我调用 x_open_display(''),程序会得到一个 NULL 响应。在 C 中,同样的事情可以正常工作。向模块添加某些内容会导致无限循环。显然我在做一些愚蠢的事情,但我看不出来。
我如何让 Fortran 看到与 C 操作相同的事物?
这一切的原因是为了将 50 年前的“尘封的甲板”代码移植到现代 Linux 下。我只想弄乱 I/O。我不想碰 50 年的调试!
我不知道这是否是唯一的原因,但与 C 相比:
我会像这样修改界面:
我会像这样调用该函数: