如何将 Fortran c_ptr 与 null 进行比较

How to compare Fortran c_ptr with null

我有一些 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

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

subroutine init()
  if( instance .eq. c_null_ptr ) then
    instance = c_init()
  end if
end subroutine

但这给了我 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.

那么我应该改用什么?

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

subroutine init() 
  if( .not. c_associated(instance) ) then
    instance = c_init()
  end if
end subroutine init