2016-01-13 57 views
0

在我的Fortran代碼中,我定義了模塊中的變量,並使用它們從主程序中使用USE語句。 爲了限制訪問我的模塊的內容,默認情況下,我聲明所有變量/函數/子程序爲private,然後明確聲明其中哪些是公共的。如何通過具有私人語句的模塊調用已使用模塊的公共變量

這工作得很好,當我想訪問我在主程序使用一個模塊的變量/函數/子程序,然而,當一個模塊mod1使用另一個模塊mod2,似乎所有的變量/功能/的子程序mod2成爲mod1的私有,無法從主程序訪問。

關鍵字是什麼使我的公開聲明在mod2公開,以便我可以從主程序訪問它們?

這裏是我的問題

main.f90時

program main 
use mod1 
implicit none 
print*,publicvar 
end program main 

mod1.f90

module mod1 
use mod2 
private 
end module mod1 

mod2.f90

的最低工作示例210
module mod2 
private 
integer, parameter, public :: publicvar = 1 
end module mod2 

要運行示例:

>ifort mod2.f90 mod1.f90 main.f90 -o main 
main.f90(6): error #6404: This name does not have a type, and must have an explicit type. [PUBLICVAR] 
    print*,publicvar 
---------^ 

它的工作原理,如果我刪除private聲明mod1,但是這不是我可以接受的,我想保持在默認情況下所有的變量/函數/子程序私人在模塊中。

+0

我可以理解爲什麼有些人我們不幸的標籤[標籤:fortran90],但在一個關於子模塊的問題?真的嗎? –

+0

@VladimirF儘管標題中提到了「子模塊」,但在我看來,問題並不在於它們。我已經編輯了(希望Mazmike會證實我是正確的)標題。 – francescalus

+2

除了IanH的回答,您可以考慮:將mod1中的默認可訪問性公開,明確地將其實體隱藏起來;在主程序中使用'mod2'。 – francescalus

回答

1

mod1中使用PUBLIC語句將與mod2關聯的使用關聯的事物標記爲mod1的公共實體。

module mod1 
    use mod2 
    private 
    public :: publicvar ! from mod2 
end module mod1 
+0

謝謝IanH。你的解決方案可以工作,但在mod2中增加一個公共變量必須伴隨mod1的修改。使用大代碼可能會變得很挑剔(考慮在'mod10'中使用'mod10'中的多個變量,使用...'mod1'。 我想知道是否有另一種解決方案,不需要明確聲明爲公共所有您感興趣的變量 – Mazkime

+1

不在當前的Fortran中,除非您刪除'mod'中的私有語句,標準的下一個版本可能包含這樣的設備 – IanH

+0

感謝您的精確度。最後使用了你的方法,也是由francescalus推薦的。我一直在等待這個新工具可能包含在這個標準的修訂版本中,因爲變量的一般定義默認爲private,明確聲明公共變量似乎是一個更好的編程規則對我來說。 – Mazkime

相關問題