如何比较Fortran c_ptr和null

Mic*_*son 4 fortran fortran-iso-c-binding

我有一些需要组合的Fortran和C代码.

我正在使用看起来像这样的Fortran界面:

module bridge
  use, intrinsic::iso_c_binding, only : c_ptr, c_null_ptr
  implicit none

  type(c_ptr) :: instance

  interface

    function c_init() result(this) bind(C, name="bridge_init")
      import
      type(c_ptr) :: this
    end function c_init

  end interface

contains

    subroutine init() 
      instance = c_init()
    end subroutine init

end module bridge
Run Code Online (Sandbox Code Playgroud)

我的问题是我想在init子程序中检查初始化,例如

subroutine init()
  if( instance .eq. c_null_ptr ) then
    instance = c_init()
  end if
end subroutine
Run Code Online (Sandbox Code Playgroud)

但这给了我一个Syntax error, found END-OF-STATEMENT when expecting one of: BLOCK BLOCKDATA PROGRAM MODULE TYPE INTEGER REAL COMPLEX BYTE CHARACTER CLASS跟随This binary operation is invalid for this data type.

那么我应该使用什么呢?

Mic*_*son 6

您只需要使用内部模块中的c_associated函数iso_c_binding.使用一个参数检查null

subroutine init() 
  if( .not. c_associated(instance) ) then
    instance = c_init()
  end if
end subroutine init
Run Code Online (Sandbox Code Playgroud)

  • 它实际上与常规Fortran指针相同.你也不要与`null()`进行比较,但你要调用`associated()`. (2认同)