pointers - 如何判断Fortran过程指针是否与特定子程序关联

标签 pointers fortran procedure

我想知道如何判断一个fortran过程指针是否与一个特定的子程序关联。下面一个MWE(基本基于my previous question)

# module file
module boundary
implicit none

type bc_type
  procedure(boundary_type), pointer, nopass :: bc
  ! some other type-bound parameters
end type

abstract interface
  subroutine boundary_type(i)
    integer :: i
  end subroutine
end interface

contains

subroutine boundaryA(i)
integer :: i
  print*, 'Boundary A at ',i
end subroutine

subroutine boundaryB(i)
integer :: i
  print*, 'Boundary B at ',i
end subroutine

end module

# main file
program main
use boundary
implicit none
type(bc_type) :: a    

  a%bc => boundaryA

end program

我知道关联函数可以用来判断一个过程指针是否关联,但是我怎么知道它关联的是哪个子程序呢?对于这里,如果bc与boundaryA或boundaryB相关联?

我试过了

associated(a%bc, boundaryA)

编译器(gfortran 4.8.2)给出一个错误,即boundaryA处“关联”内在函数的“目标”参数必须与“指针”具有相同的类型和种类。

如果删除 nopass 属性,编译器会给出错误,即“bc”处的参数“i”和“bc”处的 pass(i) 必须是派生类型“bc_type”。

最佳答案

这是一种方法。

program main
use boundary
use, intrinsic :: iso_c_binding
implicit none
type(bc_type) :: a    

  a%bc => boundaryA

if (same_proc(c_funloc(a%bc),c_funloc(boundaryA))) print *, "boundaryA"
if (same_proc(c_funloc(a%bc),c_funloc(boundaryB))) print *, "boundaryB"

    contains
    function same_proc (a,b)
    use, intrinsic :: iso_c_binding
    logical same_proc
    type(c_funptr), intent(in) :: a,b

    same_proc = transfer(a,0_C_INTPTR_T) == transfer(b,0_C_INTPTR_T)
    end function same_proc


end program

关于pointers - 如何判断Fortran过程指针是否与特定子程序关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48972233/

相关文章:

c - 将返回的指针分配给变量时出现段错误

C - 指向字符串的指针数组

php - mysql与php在表中添加一行

arrays - C 中 char ** 和 char (*)[100] 有什么区别?

c++ - 为什么这个指针包含存储在堆上的地址?

module - Fortran 中 INCLUDE 和模块之间的区别

string - 为什么 GDB 认为我的 Fortran 字符串是 ~4GiB

class - Fortran 指针多态性

Mysql程序,循环返回分层数据

java - 如何在我的 Web 项目中使用 jSTL 调用 Oracle 存储过程?