子程序我有这样的Fortran程序指针指向一个什么也不做
:
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”的代码做了一些工作,但子程序“作业2”什么都不做。换句话说,在某些情况下,我需要完成'x'和'job1'。在其他情况下,我只需要做'x'。我的问题是我应该如何定义job2。它似乎简单地使用null()不起作用。我在做什么,现在是这样的:
subroutine job2(i,j,k)
integer,intent(in) :: i,j,k
end subroutine
然而,这看起来傻了,我得到了很多编译警告,当我编译的代码,因为没有使用这些参数。有没有更聪明的方法来做到这一点?
我想这样做的原因是我可以避免在do循环中进行条件判断。如果我按照你的方式来做,它将和do(...)在do循环中调用job1一样。然后我不需要这里的程序指针。对不起,我没有说清楚我的观点。 – shuttler 2013-03-09 00:39:55
如果你只需要调用p(...)'并让编译器自动决定调用过程指针'p'(如果它指向某个东西)或者决定在指针为空时不调用任何东西,那么编译器会在幕后做一个IF,就像那样。考虑到运行时速度,如果编译器自动测试过程指针是否为空或者是否必须写出'if(associated(p))'测试,它会产生多大的差异? – 2013-03-09 03:28:41
继续M.S.B.如果执行速度激发了你的需求,那么我希望指针所指向的过程动态调用的开销总是大于一个简单的条件测试(即,调用一个不需要花费的时间比测试逻辑而不是调用过程)。从执行方面来说,无论如何,在真正的计划中,这两种选择都可能无关紧要。如果你的需求受到其他情况的激励,那么它会帮助你知道它是什么。 – IanH 2013-03-09 05:59:34