簡體   English   中英

為 Fortran 2003 代碼聲明舊 F77 函數和子例程的類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM