Fortran过程指针指向不执行任何操作的子例程

时间:2013-03-08 23:17:18

标签: pointers fortran procedure

我有这样的代码

:
procedure(),pointer :: p
if ()
  p => job1
else
  p => job2
endif

do i=1,a_big_number
  call x(...)
  call p(i,j,k)
enddo

子程序'job1'做了一些工作,但子程序'job2'什么也没做。换句话说,在某些情况下,我需要完成'x'和'job1'。在其他情况下,我只需要做'x'。我的问题是如何定义job2。似乎只使用null()不起作用。我现在正在做的是:

subroutine job2(i,j,k)
integer,intent(in) :: i,j,k
end subroutine

但是,这看起来很傻,在编译代码时我收到了很多编译警告,因为没有使用这些参数。有更聪明的方法吗?

2 个答案:

答案 0 :(得分:3)

如果没有任何有用的事情可以使过程指针无效,然后在通过指针调用过程之前测试关联状态。

PROCEDURE(interface_that_matches_job1), POINTER :: p
IF (...) THEN
  p => job1
ELSE
  NULLIFY(p)   ! Or p => NULL()
END IF

DO i = 1, a_big_number
  CALL x(...)
  IF (ASSOCIATED(p)) CALL p(i,j,k)
END DO

答案 1 :(得分:0)

如果您关心的是循环中的if语句,您可以将if语句放在循环之外:

if (condition) then
  do ii = 1, big_number
    call x(...)
    call p(i,j,k)
  end do
else
  do ii = 1, big_number
    call x(...)
  end do
end if

然后在此版本上进行一些计时,然后在循环中使用if的版本:

do ii = 1, big_number
  call x(...)
  if (condition) then
    call p(i,j,k)
  end if
end do

我宁愿猜测你不会发现它们之间有任何明显的区别,因为循环中的子程序调用可能已经给你一个比if语句引起的更大的开销。