2016-09-25 119 views
0

我最近發現了Fortran 2008的新功能,即SUBMODULE限制從其他模塊過程訪問模塊過程

請看看我的最低工作示例。編譯後,它把終端上做如下:

Accessed sub0 
Accessed sub1 
Accessed sub2 

也就是說,因爲它應該的sub1模塊程序和sub2可以CALL對方,一切都OK。

由於代碼架構和維護等原因,我需要以某種方式限制此訪問。也就是說,模塊程序(sub1sub2)彼此不可見。 我可以這樣做嗎?

MODULE parent 
    PRIVATE 
    PUBLIC :: sub0 
    INTERFACE 
     MODULE SUBROUTINE sub1() 
     END SUBROUTINE 
     MODULE SUBROUTINE sub2() 
     END SUBROUTINE 
    END INTERFACE 
    CONTAINS 
    SUBROUTINE sub0() 
     PRINT *, 'Accessed sub0' 
     CALL sub1() 
    END SUBROUTINE 
END MODULE 

SUBMODULE (parent) submod1 
    CONTAINS 
    MODULE PROCEDURE sub1 
     PRINT *, 'Accessed sub1' 
     CALL sub2() 
    END SUBROUTINE 
END SUBMODULE 

SUBMODULE (parent) submod2 
    CONTAINS 
    MODULE PROCEDURE sub2 
     PRINT *, 'Accessed sub2' 
    END PROCEDURE 
END SUBMODULE 

PROGRAM driver 
    USE parent 
    CALL sub0() 
END PROGRAM 
+0

爲什麼不只是2個程序的2個單獨的模塊? –

+0

@VladimirF當然可以。這正是我現在所做的。但是,我正試圖像'SUBMODULE'一樣保持Fortran的新現代功能。此外,就我所知,C#中的代碼映射在Fortran中不可用,所以我害怕使用大量源代碼(調試,維護和開發)。嘗試了上述方案以簡化程序之間的CALL控制,但這似乎是錯誤的。 – Shaqpad

回答

3

不是。

兩個sub1sub2sub0訪問,這意味着任一個(或一些組合):

  • subsub2有在同一水平的模塊/子模塊的層次結構的作爲sub0是已知的,就像在此樣品中。 sub1sub2的子程序必須處於與sub0或更低的相同級別,在這種情況下,主機關聯使得sub1sub2過程的知識可用於其他過程。

  • sub1sub2需要是其他兩個模塊的公共實體。但在這種情況下,sub1sub2的子程序總是可以直接引用定義其他模塊的模塊。

  • sub1sub2是外部程序。再次,sub1sub2的子程序可以直接訪問其他外部程序。

實體在一臺主機可以從子作用域隱藏如果在兒童範圍,在F2015草案中的主機實體陰影的名稱(或使用的import語句的擴展功能的名稱標準)。你可以把一個虛擬的聲明放在一個與你想要從一個特定範圍中阻塞的過程的名字相同的名字中,但這是相當人爲的。

+0

*「sub1和sub2需要是其他兩個模塊的公共實體,但在這種情況下,sub1或sub2的子程序總是可以直接引用定義另一個模塊的模塊。」*但他們不需要。 –