我有这样的代码
:
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
但是,这看起来很傻,在编译代码时我收到了很多编译警告,因为没有使用这些参数。有更聪明的方法吗?
答案 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
语句引起的更大的开销。