2011-10-18 20 views
3

爲什麼Fortran將標量表達式提升爲數組,表達式,但不是作爲過程的參數?特別是,爲什麼標準組織做出這個設計決定?僅僅是因爲含糊不清,程序是否過載?在這種情況下的錯誤信息可以作爲替代方法嗎?沒有提升Fortran中的數組標量參數

例如,在下面的代碼中,最後一條語句x = foo(7)產生GFortran錯誤:Error: Rank mismatch in argument 'a' at (1) (1 and 0)

module m 

    public :: foo 

    contains 

    function foo(a) result(b) 
    integer, dimension(:)  :: a 
    integer, dimension(size(a)) :: b 
    b = a+1 
    end function foo 

end module m 

program p 

    use m 

    integer, dimension(4) :: x 
    integer, parameter, dimension(4) :: y = (/1,2,3,4/) 

    x = 7 
    x = foo(x) 
    x = foo(y) 
    x = foo(x + 7) 
    x = foo(7) 

end program p 

這個問題應該問到爲什麼數組賦值會將標量值源提升爲數組目標;不像數組函數。我期望這只是一個方便的特例。任何意見在下面的乞討帽感激地收到。

回答

4

如果您希望函數處理縮放器和數組參數,請將其聲明爲「元素」並使用縮放器僞參數。然後它將能夠處理縮放器和數組實際參數,包括縮放器表達式。這會滿足你的需求嗎?

的變化:

elemental function foo(a) result(b) 
    integer, intent (in)  :: a 
    integer :: b 
    b = a+1 
    end function foo 

或許他們提供一種方式做你想要什麼,一個辦法是夠嗎?

+0

這可能不像OP所希望的那樣普遍,因爲元素對函數的功能有很多限制。 – bdforbes

+0

當然可以。大多數內置函數都是元素而不是它們。而一個元素函數需要arity> 1來將一個標量提升爲一個數組。我的問題本來會更好地集中在賦值語句上,這將促進一個標量。但是這更有意義:賦值語句是特殊的。我最近一直在尋找太多的APL ...... – user2023370

3

使用顯式接口(在使用模塊過程時會自動獲得)在Fortran中調用過程需要TKR(類型,種類,等級)匹配。由於數組與標量不同,更不用說級別不匹配,所以這是不允許的。

是否由於含糊不清,應該是程序過載?

這將是一個問題,是的。

這種情況下的錯誤消息是否可以替代?

粉紅色的獨角獸是否存在?也許,但據我所知,他們沒有。 IOW,Fortran標準目前需要TKR匹配,因此符合標準的編譯器必須執行此要求。如果您想改變這一點,我建議向標準委員會提出建議。

+0

謝謝janneb。我很感謝你的回答,但我實際上是在尋找「爲什麼」。 – user2023370

0

我想這個答案很清楚。讓我們稍微修改您的示例:

module m 

    public :: foo 

    contains 

    function foo(a) result(b) 
    integer, dimension(:)  :: a 
    integer, dimension(size(a)) :: b 
    b = a+1 
    a(2) = -777  ! new line; modify one element 
    end function foo 

end module m 

program p 

    use m 

    integer :: x 
    integer, dimension(4) :: y 

    x = 7 
    y = foo(x) ! pass a scalar 

end program p 

在調用foo之後x應該是什麼?

現在,當然,你可以有參數的傳遞取決於它是否是一個intent(in)變量變化的語義,但就是不東西這是要澄清東西程序員。

如果函數調用應該以某種方式'分配'數組元素,那麼MSB指出,元素是要走的路。否則,只要確保一個參數與參數匹配即可。

+0

謝謝。我在想這個論據是「意圖(in)」。這就是爲什麼我包含'parameter'參數,'y'。正如你所說,'元素'是要走的路。 – user2023370