我正在尝试使用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
答案 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。