2013-03-08 71 views
0

子程序我有这样的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 

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

回答

2

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

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 
+0

我想这样做的原因是我可以避免在do循环中进行条件判断。如果我按照你的方式来做,它将和do(...)在do循环中调用job1一样。然后我不需要这里的程序指针。对不起,我没有说清楚我的观点。 – shuttler 2013-03-09 00:39:55

+1

如果你只需要调用p(...)'并让编译器自动决定调用过程指针'p'(如果它指向某个东西)或者决定在指针为空时不调用任何东西,那么编译器会在幕后做一个IF,就像那样。考虑到运行时速度,如果编译器自动测试过程指针是否为空或者是否必须写出'if(associated(p))'测试,它会产生多大的差异? – 2013-03-09 03:28:41

+1

继续M.S.B.如果执行速度激发了你的需求,那么我希望指针所指向的过程动态调用的开销总是大于一个简单的条件测试(即,调用一个不需要花费的时间比测试逻辑而不是调用过程)。从执行方面来说,无论如何,在真正的计划中,这两种选择都可能无关紧要。如果你的需求受到其他情况的激励,那么它会帮助你知道它是什么。 – IanH 2013-03-09 05:59:34

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 

我宁愿猜测,你不会看到任何betwee差异显著n,因为循环中的子程序调用可能已经给您带来了比if声明造成的更大的开销。

相关问题