2012-07-13 194 views
2

我正在將幾個模擬代碼耦合在一起。目前,有3個代碼,但未來可能會更多。您可以在下圖中考慮信息交換:Fortran命名空間衝突

sim1 <====> sim_main <=====> sim2 

信息交換是通過每邊有限的接口完成的。

我最近診斷出一個問題,其中sim1中的常見塊與sim2中引起段錯誤的子例程具有相同的名稱。簡單的解決方案是在sim1中更改公共塊的名稱,但這並不理想,因爲如果sim1的開發者使用sim1-2.0,那麼我將不得不再次修改該公共塊的名稱。由於接口相對有限,我想知道有沒有更好的解決辦法是寫一個簡單的模塊:

module sim2_mod 
contains 
include "sim2.f90" 
end 

由於這應該把所有的程序在SIM2到sim2_mod命名空間可能是一個use d有限的基礎。這是一個好主意嗎?一個壞主意?有沒有情況下,這不會工作?在sim2中使用的通用塊仍然具有全球範圍?

回答

4

那麼,如果sim2.f90只包含行,當它們拼接成您的建議sim2_mod時,形成一個語法上有效的Fortran源文件,您的建議將工作。如果沒有,你將不得不編輯源代碼。

雖然你這樣做,你也可以使它成爲一個模塊,並在sim_main中使用它。一旦你有這麼多,你可以在use聲明中添加一個only子句,並進行一些重命名,並以這種方式處理名稱衝突。

通用塊在整個程序中的確具有全局範圍,我認爲Fortran編寫社區內的共識是避免全局可用性可能導致的問題的首選方法,不僅是您目前面臨的問題,是用一個定義了公共塊包含的所有變量的模塊替換它們。然後,您可以使用模塊變量更多地控制(以前)全局變量的可用性和命名。

這種方法實施起來很麻煩,確實會增加下一個版本sim1也需要重新編制的可能性。但是,那麼是不是關於你告訴sim1的開發者放棄共同塊並實施更現代一點的時間?

+0

謝謝 - 雖然我不認爲我會說服任何開發人員使他們的代碼現代化。我認爲學習像廚師這樣一個晦澀難懂的語言會更容易,將'sim1'翻譯成廚師,然後再將它們耦合起來::-p – mgilson 2012-07-13 19:14:14