0

我有这样的代码

:
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

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

4

2 回答 2

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
于 2013-03-09T00:22:50.940 回答
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我宁愿猜测您不会看到它们之间有任何显着差异,因为循环中的子例程调用可能已经给您带来了比语句引起的开销大得多的开销。

于 2013-03-09T07:29:16.283 回答