Fortran编译报错.not.操作数为REAL(4)类型如何修复
Fortran编译报错:.not.操作数类型为REAL(4)修复
错误根因
报错来自Fortran默认的隐式类型规则:未显式声明的标识符,以I/J/K/L/M/N开头默认判定为整型,其余开头默认判定为REAL(4)实型。
代码中没有声明eof是内置的文件尾判断逻辑函数,编译器按照隐式规则将eof识别为实型变量,因此eof(1)被判定为实型表达式。而.not.是逻辑运算符,仅接受逻辑类型操作数,因此抛出类型不匹配错误。
修复步骤
- 代码最开头添加
IMPLICIT NONE,关闭隐式类型规则,强制所有变量、函数必须显式声明,从根源避免这类隐式类型错误。 - 若要继续使用
eof()写法,需显式声明其为内置逻辑函数:INTRINSIC :: eof,同时补充所有未声明变量的定义:REAL :: a1,a2,a3,a4,INTEGER :: irec,jj,i,j。 - (兼容性更好的推荐写法)放弃依赖
eof()函数,改用read语句的iostat返回值判断文件结束状态,规避不同编译器对老内置函数的支持差异,修正后的完整可编译代码如下:
! 修正后的声明段 IMPLICIT NONE INTEGER, PARAMETER :: nx=121, ny=81 REAL :: u(nx,ny),v(nx,ny),p(nx,ny) REAL :: a1,a2,a3,a4 INTEGER :: irec, jj, i, j, io_err ! 文件打开逻辑 open(1,file='u-component.txt') Read(1,*) open(2,file='v-component.txt') Read(2,*) open(3,file='Pressure.txt') Read(3,*) open(11,file='windVN.TXT') irec = 0 DO ! 测试读取判断是否到文件尾 read(1,*,iostat=io_err) a1,a2,a3,a4,u(1,1) IF (io_err /= 0) EXIT backspace(1) ! 回退测试读取的记录,避免数据丢失 jj = irec ! 嵌套读取逻辑 do 1 j=1,ny Do 2 i=1,nx read(1,*) a1,a2,a3,a4,u(i,j) read(2,*) a1,a2,a3,a4,v(i,j) read(3,*) a1,a2,a3,p(i,j) 2 continue 1 continue ! 输出逻辑 write(11,*) write(11,*) '"tstep"', jj, '"item"',1, '"layer"', 0 do 3 j=1,ny write(11,101) (u(i,j),i=1,nx) 3 continue write(11,*) write(11,*) '"tstep"', jj, '"item"',2, '"layer"', 0 do 4 j=1,ny write(11,101) (v(i,j),i=1,nx) 4 continue write(11,*) write(11,*) '"tstep"', jj, '"item"',3, '"layer"', 0 do 5 j=1,ny write(11,102) (p(i,j)/1000,i=1,nx) 5 continue irec = irec +1 END DO Write(*,*) irec,' Step', irec*3, ' h' 101 format(121f9.2) 102 format(121f9.2) Pause Stop END
补充说明:使用iostat判断文件尾的写法兼容所有Fortran 77及以上标准的编译器,不会出现内置函数识别偏差的问题。运行前要确保三个输入文件的行数、数据格式完全匹配,否则会出现读错位的问题。
内容的提问来源于stack exchange,提问作者Minh Nguyễn
相关产品推荐
相关产品推荐

