XOpenDisplay fortran 失败,但 C 工作正常

问题描述 投票:0回答:1

我在这里找到了 Fortran 的 Xlib 接口。当我运行一个简单的 C 代码(创建 X windows)时,一切都很好。但最简单的 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 fortran x11
1个回答
0
投票

我不知道这是否是唯一的原因,但与C相比:

  • Fortran 字符串不以空字符结尾
  • 字符串的长度在函数调用中以隐藏参数传递,而 C 端的函数不知道这个参数。

我会这样修改界面:

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,len=1), intent(in) :: display_name(*)
        type(c_ptr) :: x_open_display
    end function x_open_display
end interface

我会这样调用该函数:

display = x_open_display(''//c_null_char)
© www.soinside.com 2019 - 2024. All rights reserved.