[英]Declaring types of old F77 functions and subroutines for Fortran 2003 code
我們有一個新的 Fortran 2003 代碼,它調用並鏈接到 Fortran 77 庫(在外部包中)。 有沒有辦法在 F2003 的外部庫中為 F77 函數和子例程編寫聲明,以確保在使用錯誤參數類型調用函數時給出錯誤消息? 一種方法是為每個 function 編寫包裝器,但這似乎需要做很多工作。
(順便說一句,F77 代碼實際上是調用 C 代碼的包裝器。理想情況下,最好在 F2003 中重寫 C 包裝器,但這也是很多工作)。
英特爾編譯器 ifort 具有選項 -gen-interfaces。 我認為這個選項正是你所需要的。 與 gfortran 編譯器(不幸的是沒有此功能)不同,ifort 需要花錢,也許您可以讓某人為您真正舊的 fortran77stuff 運行一次 ifort -gen-interfaces? 我假設 fortran77 代碼不再變化,所以生成的 *__genmod.f90 可以使用,不必一次又一次地生成。
另一種方法是制作一個模塊:
MODULE NOSTALGIA77
CONTAINS
include 'file1.f'
...
include 'fileN.f'
END MODULE NOSTALGIA77
現在,當您編譯模塊而不是單獨的文件時,您可以在將 USE NOSTALGIA77 添加到 Fortran2003 代碼后使用函數和子例程,編譯器將檢查您的調用的正確性。
注意:該示例假定 fortran77 代碼僅包含子例程。 如果它還包含其他內容(BLOCK DATA 和其他我們不想記住的內容),則模塊可能會更難制作,因為有些內容會出現在 CONTAINS 之前,而有些則在之后。 但它仍然可以完成(而且時間不會太長)。
祝你好運!
編輯:
也許https://shroud.readthedocs.io/en/latest/可以幫助你。 我做了一些小測試(參見https://shroud.readthedocs.io/en/latest/appendix-A.html )。 似乎可行的方法是將 header 文件的幾行放入 yaml 文件庫中。
declarations:
- decl: void NoReturnNoArguments()
- decl: double PassByValue(double arg1, int arg2)
I suppose this yaml file can easily be constructed from your header files using sed, awk, python or whatever scripting language you like. 接下來,你運行的只是 shroud clibrary.yaml,然后是 fortran 模塊 libray_mod,你可以包含它,然后你的所有功能都可用,並且它們的使用經過測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.