Fortran IV,编译名为constant的错误

时间:2014-03-04 20:25:27

标签: fortran gfortran legacy

我正在尝试使用gcc fortran编译器(gfortran 4.8.1 -4)编译旧的Fortran IV代码。我将编译器运行为:gfortran nrlxrf_a.for -std = legacy。这些是错误消息:

C:\ MinGW \ bin> gfortran nrlxrf_a.for -std = legacy

NRLXRF_a.for:5525.72:

  IF ( NFILL.EQ. 0)
                                                                    1

错误:无法在(1)

处分配命名常量

我已检查过该行,并且在语句结束后没有空格。

NRLXRF_a.for:5531.7:

 1 ( HFILL( I), I= 1, NFILL), ( H( IU, I), I= I1, I2)
   1

错误:无法在(1)

处分配命名常量

任何建议都将不胜感激。 托马斯

这是使用HFILL和NFILL的代码部分。这是为编译器选择正确的选项还是语法错误?

C:DOC IS THE DATUM NUMERIC?  IF SO, GO TO 44; ELSE GO TO 50.
       NFILL= 0
       HTEST= H( IU, I1)
      IF ( HTEST.NE. HSIGN( 1)) GO TO 41
      GO TO 45
C:-------
 41   IF ( HTEST.NE. HSIGN( 2)) GO TO 42
 45    NFILL= 1
       HTEST= H( IU, I1+ 1)
 42   DO 43 J= 1, 11
      IF ( HTEST.EQ. HDIG( J)) GO TO 44
   43 CONTINUE
       NFILL= 0
      GO TO 50
C:-------
C:DOC DATUM IS NUMERIC.  CALCULATE NO. OF BLANKS TO RIGHT-JUSTIFY.
 44    NFILL= NC- NII
      IF ( I2P.NE. I2) WRITE( KW, 111) ( H( IU, J), J= I1, I2P)
      IF ( I2P.NE. I2) WRITE( KW, 112) ( H( IU, J), J= I1, I2)
C:DOC WRITE ANY FILL BLANKS AND DATUM TO SCRATCH FILE.
 50   CONTINUE
      IF ( NFILL.EQ. 0) WRITE( KS, 102) ( H( IU, I), I= I1, I2)
      IF ( NFILL.EQ. 0)                                             line 5525
C:     1 ENCODE( NC, 102, HIN( 4* NR- 3)) ( H( IU, I), I= I1, I2)
      IF ( NFILL.NE. 0) WRITE( KS, 102)
     1 ( HFILL( I), I= 1, NFILL), ( H( IU, I), I= I1, I2)
      IF ( NFILL.NE. 0)
C:     1 ENCODE( NC, 102, HIN( 4* NR- 3))
     1 ( HFILL( I), I= 1, NFILL), ( H( IU, I), I= I1, I2)           line 5531
       I1= I3+ 1

1 个答案:

答案 0 :(得分:3)

如果假设代码基于http://www.nist.gov/mml/csd/inorganic/xrf.cfm的代码,则问题是gfortran不是Fortran IV编译器,并且它不支持其他编译器所做的扩展。

从该来源获得第一个错误的完整“行”(考虑到延续):

      IF ( NFILL.EQ. 0)
     1 ENCODE( NC, 102, HIN( 4* NR- 3)) ( H( IU, I), I= I1, I2)

根据gfortran documentation ENCODE不支持。

我想在你提交给你(或某人)的代码中试图删除麻烦的行。但不正确:行已被删除,但不是整个语句,可以包含许多行。

忽略删除编码从根本上改变了代码含义的事实,您需要删除ENCODE出现的整个语句。删除所有后续连续行和第一个前一个非连续行。在这些情况下,行5525,5529和5520。