2011-08-22 81 views
5

假設我有一個接受兩個數組作爲輸入的子例程。一個給予意圖(in),另一個給予意圖(out)。後者是以任意方式從前者衍生而來的。但是,如果我通過兩個虛擬參數的相同實際參數會怎樣?一般來說,結果不會是子程序的意圖。查看下面的代碼片段。Fortran:將相同的數組作爲兩個僞參數傳遞給子例程

問題是,編譯器似乎並不在乎,即使我已經給出了意圖標誌。我正在使用英特爾Visual Fortran Composer 12和所有診斷程序。有沒有更好的方法來編寫子程序,或者我缺少一些編譯器選項,以使代碼更安全?

module foo 

    contains 

    subroutine sub_a() 
     implicit none 
     real::array(10,10) 

     call sub_b(array,array) 

    end subroutine 

    subroutine sub_b(array1,array2) 
     implicit none 
     real,intent(in)::array1(10,10) 
     real,intent(out)::array2(10,10) 

     !array2 is derived from array1 somehow 

    end subroutine 

end module foo 

回答

7

這被稱爲別名 - 通過兩個不同的名稱引用相同的項目。在大多數情況下,這在Fortran中是不允許的。您的示例不是合法的Fortran - 請參見http://software.intel.com/en-us/blogs/2009/07/10/doctor-fortran-in-ive-come-here-for-an-argument-side-2/(具有此特定情況),它通過用於兩個僞參數的相同實際參數進行別名。 Fortran編譯器不需要診斷所有違反語言規則的行爲,這似乎是編譯器無法識別的示例。

編輯:允許別名。被禁止的是通過別名來改變僞參數的值,這裏是另一個僞參數。規則對指針和目標參數的限制較少。具體規則在Adams等人的「The Fortran 2003 Handbook」中有描述。

+0

謝謝,清除它。不幸的是,英特爾Visual Fortran對此沒有提出警告。我想唯一的解決方案是使用適當的子程序調用的紀律。 – bdforbes

+0

您如何比較兩個輸入數組的位置?這是一件安全的事情嗎?另外,顯然F2003沒有實現loc函數,是否有等價的? – bdforbes

1

把周圍那就是意圖(中)參數括號使代碼合法的,因爲你正在有效地傳遞一個副本:

call sub_b((array),array) 
相關問題