2013-03-08 68 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聲明造成的更大的開銷。

相關問題