2014-01-30 13 views
2

我有一個共享庫子程序:傳遞的數組與更多的元素預計在子程序

SUBROUTINE DLLSUBR(ARR) 
    IMPLICIT NONE 
    INTEGER, PARAMETER :: N = 2 
    REAL ARR(0:N) 
    arr(0) = 0 
    arr(1) = 1 
    arr(2) = 2 
END 

而假設我會叫它從可執行:

REAL ARR(0:3) 
CALL DLLSUBR(ARR) 

注:該代碼在Debug + /check:all選項打開時沒有任何警告或錯誤,編譯並運行(DLLSUBR位於模塊內部)。

這可能導致內存損壞或一些奇怪的行爲?在哪裏可以找到有關在Fortran規範中傳遞具有不同大小的數組的信息?

+0

看到我的編輯更詳細的解釋。 –

回答

3

如果您將僞參數元素計數爲較小或相等,它實際上允許通過序列關聯規則顯式形狀數組。當子程序需要更多元素時,它是被禁止的。

顯式形狀數組通常需要參數通過副本傳遞。當編譯器無法證明數組是連續的時(指針或假定的形狀數組僞參數),會發生這種情況。如果傳遞的元素數量較少,則該子例程可以在數組部分的副本之後訪問一些垃圾。

在你的情況下,一切都會好的,因爲你傳遞給子程序的次數會減少。

2008的Fortran 12.5.2.11.4:

4表示元素序列和 對應於是陣列的僞參數的實際參數與所述僞參數,如果僞參數相關序列 是明確形狀或假定大小的數組。實際 參數的排名和形狀不需要與僞參數的排名和形狀 一致,但僞參數中元素的數量不得超過實際參數的元素序列中元素的數量 。如果 僞參數爲假設大小,則僞參數中元素的數量恰好是元素 序列中元素的數量。

+0

如果它是共享庫,它需要導出以便能夠鏈接它(與另一端的語言無關) – Peter

+0

它也是如何打破標準,你能指點我的鏈接/部分嗎?編譯器可以檢查API,但我想知道更多關於ABI更改的信息(在我的示例中,API保持不變) – Peter

+0

廣告評論1)是的,但在正常的操作系統上,您不關心這些指令,因爲它是自動完成的。我必須找出它在Windows上的作用。另外,當我在Windows上使用gfortran進行一些'bind(C)'回調函數時,我從來不需要這樣做,它只是工作。 –