【问题标题】:F2C structure and recordF2C结构和记录
【发布时间】:2020-04-30 01:16:02
【问题描述】:

我正在使用F2C (FORTRAN 77 TO C) 将一个巨大的 FORTRAN 代码转换为 C。我的一个源 FORTRAN 文件有一个包含文件,F2C 由于某些原因不喜欢它。这是扩展名为 .INS 的包含文件(TAGLINE.INS)(我怀疑扩展名是否重要):

C
C
C***  SCRATCH INPUT DATA FROM FILE FNAM  (.RTV = RAW INPUT TAG VALUE)
C
          STRUCTURE     /STAGRICL/

            CHARACTER*76     UFN     !! U72 FILENAME.UP.CASE     INIT BLANK
            CHARACTER*76     RFN      ! R72 FILENAME.RAWCASE     INIT BLANK
            INTEGER*4        LFN      ! I4  FILENAME.LENGTH      INIT 0    

            CHARACTER*32     USN     !! U32 SECTION-NAME-UP.CASE INIT BLANK
            CHARACTER*32     RSN      ! R32 SECTION-NAME RAWCASE INIT BLANK
            INTEGER*4        LSN      ! I4  SECTION-NAME-LENGTH  INIT 0    

            CHARACTER*32     UTN     !! U32 TAG-NAME-UP.CASE     INIT BLANK
            CHARACTER*32     RTN      ! R32 TAG-NAME-RAWCASE     INIT BLANK
            INTEGER*4        LTN      ! I4  TAG-NAME-LENGTH      INIT 0    

            CHARACTER*80     UTV      ! U80 TAG-VALUE.UP.CASE.IN INIT BLANK
            CHARACTER*80     RTV     !! R80 TAG-VALUE.RAWCASE.IN INIT BLANK
            INTEGER*4        LTV      ! I4  TAG-VALUE-LENGTH     INIT 0    

            CHARACTER*80     RWL      ! R80 TAG-RAW.WHOLE.LINE   INIT BLANK
            INTEGER*4        LWL      ! I4  TAG-RAW.WHOLE.LENGTH INIT 0    
            INTEGER*4        NWL      ! I4  LIN.#.IN.ORIG.FILE   INIT 0    

            LOGICAL*4        SET      ! L4  TAGRICL   SET YET ?  INIT FALSE
            LOGICAL*4        USE      ! L4  TAGRICL  USED YET ?  INIT FALSE

      END STRUCTURE
C
C
      PARAMETER                   (N1000=200)
      RECORD /STAGRICL/   TAGRICL(N1000)  ! 1000.MAX TAG.NAMES.PER.FILE
      COMMON /CTAGRICL/   TAGRICL          ! RETURNED TAG.NAMES+TAG.VALUES

尝试使用 F2C 将源代码转换为 C 时,出现以下错误:

Error on line 5 of TAGLINE.INS: unclassifiable statement (starts "structure/")
Error on line 34 of TAGLINE.INS: unclassifiable statement (starts "record/sta")

显然,F2C 抱怨包含文件 (STRUCTURE /STAGRICL/) 中的结构。 Fortran 77 注释行以字符 c 开头。

我的源代码包含以下 .INS 文件:

SUBROUTINE FINDSEC (SECTION,    ISEC1,ISEC2)
C
c------no.mo.$debug.no.no.no
C
      INCLUDE 'TAGLINE.INS'
C
C
      CHARACTER*(*)       SECTION
......rest of the subroutine

感谢您的帮助

【问题讨论】:

  • 对所有 Fortran 问题使用 fortran 标签。没有多少人只关注特定的fortran77 版本。而且,您的代码甚至不是 Fortran 77。它不是任何标准的 Fortran。

标签: c fortran fortran77 f2c


【解决方案1】:

RECORDSTRUCTURE 不是标准的 Fortran,甚至不是广泛支持的扩展(至少在 f2c 真正相关的日子里)。它是 DEC 开发的特殊扩展,因此保留在 DEC 编译器(Compaq 和 Intel)的后期开发中。

这些扩展已在几年前移植到 Gfortran,但在 g77f2c 等非常古老的编译器中,甚至在某些当前编译器中不受支持。使用 gfortran 编译时,这些扩展必须由特殊标志允许。

您的选择是将 Fortran 代码重写为 f2c 可以理解的代码,或者自己翻译代码。或者,就像本世纪人们经常做的那样,保留您的 Fortran(+DEC 扩展)代码,使用当前的 Fortran(+扩展)编译器对其进行编译,然后从 C 调用二进制文件。

【讨论】:

  • 感谢您的意见,弗拉基米尔。这是标准的 FORTRAN 语法吗? REAL*4 ZZ [ALLOCATABLE ] (:) 你会推荐什么作为 C/C++ 中的等效类型?
  • 你对如何用 C 重写 STRUCTURE / RECORD 块有什么建议吗?
  • @Saeed REAL*4 不是标准 Fortran,但受到广泛支持。与 (:) 可分配的是 Fortran 90。在这种情况下,方括号不是标准的 Fortran,我不知道它们是什么意思。
  • DEC 结构将是 C 中的结构,这个扩展非常受 C 的启发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 2011-08-17
  • 2013-05-18
  • 1970-01-01
相关资源
最近更新 更多