用Fortran语言调试子程序
我试图调试我的代码,其中包括一个子例程和一个模块。我从子程序中得到两条错误消息:1)Symbol不是伪变量,2)Legacy Extension:REAL array index。我在代码中指出错误的来源 主程序读入一个包含一列数字的文件。然后我使用这个文件作为参数调用子例程。然后,子程序会给我这两条错误消息。如何修复代码,从而修复这些错误消息?谢谢 注意:我根据下面有用的注释编辑了代码。我仍然收到相同的错误消息用Fortran语言调试子程序,fortran,Fortran,我试图调试我的代码,其中包括一个子例程和一个模块。我从子程序中得到两条错误消息:1)Symbol不是伪变量,2)Legacy Extension:REAL array index。我在代码中指出错误的来源 主程序读入一个包含一列数字的文件。然后我使用这个文件作为参数调用子例程。然后,子程序会给我这两条错误消息。如何修复代码,从而修复这些错误消息?谢谢 注意:我根据下面有用的注释编辑了代码。我仍然收到相同的错误消息 MODULE Stack1 IMPLICIT NONE INTEGER, PAR
MODULE Stack1
IMPLICIT NONE
INTEGER, PARAMETER:: nx = 48, ny = 48
CONTAINS
SUBROUTINE Stack2
REAL,DIMENSION(-nx:nx,-ny:ny),INTENT(INOUT):: f !produces error message 1)
REAL :: x0,y0,x1,y1,x,y,a0,a1,a2,a3,nstep,dx,dy
INTEGER :: i
DATA x0,x1,y0,y1,nstep/0.d0,1.d0,0.d0,1.d0,10/
p(x,y)=a0 +a1*x+a2*y+a3*x*y !interpolant polynomial
!now evaluate the function f on the 4 known grid points
!use this to solve for the unknown interpolant coefficients a0,a1,a2,a3
a0=(f(x0,y0)*x1*y1-f(x1,y0)*x0*y1+(f(x1,y1)*x0-f(x0,y1)*x1)*y0 )/&
(x1*y1-x0*y1+( x0-x1 )*y0 ) !produces error message 2)
a1=(f(x1,y0)*y1-f(x0,y0)*y1+(f(x0,y1)-f(x1,y1))*y0 )/&
(x1*y1-x0*y1+( x0-x1 )*y0 ) !produces error message 2)
a2=(f(x0,y1)*x1-f(x0,y0)*x1+(f(x1,y0)-f(x1,y1))*x0 )/&
(x1*y1-x0*y1+( x0-x1 )*y0 ) !produces error message 2)
a3=(f(x1,y1)-f(x1,y0)-f(x0,y1)+f(x0,y0) )/&
(x1*y1-x0*y1+( x0-x1 )*y0 ) !produces error message 2)
DO i=0,nstep
x=x0+dx*FLOAT(i)
y=y0+dy*FLOAT(i)
y=0.75d0*y1
print 100,x,y,p(x,y),f(x,y)
20 continue
100 format('x,y,p,f=',4(3x,e10.3))
END DO
END SUBROUTINE Stack2
END MODULE Stack1
PROGRAM StackProblem
USE Stack1
IMPLICIT NONE
INTEGER :: i,j
REAL,DIMENSION(-nx:nx,-ny:ny) :: Func
OPEN(UNIT=11, file='TestFile1.dat',status='old')
DO i=-nx,nx
DO j=-ny,ny
READ(11,*) Func(i,j)
END DO
END DO
CALL Stack2(Func)
END PROGRAM StackProblem
注意,文件TestFile1.dat只是一个包含实数的单列文件,例如:
1.30482
1.30787
1.31098
1.32983
我将首先处理您的错误消息。然后,我将指出我看到的其他一些问题,并尝试建议您如何选择寻求解决方案
stack2
是用程序stackproblem
中的参数调用的。但是,stack2
在其定义中没有参数。仅用intent(inout)
声明变量f
是不够的,可能会导致其他错误消息stack1
中的f
声明为REAL
值的2D数组。当然,可以使用f(行,列)
访问数组中的每个元素,其中row
是行号,col
是列号。此外,行、列
应该是整数。但是,在子例程stack2
中,您使用real
值访问数组的元素。我认为根本的问题是你把f
当作一个函数来对待,但事实并非如此- 变量(?)函数(?)
未声明/定义。由于使用了p
,这也会导致编译器错误隐式无
模块
行之后插入隐式无
,让编译器检查常见错误源。我个人认为,如果没有安全带,开发代码是在浪费时间;你可能也能猜出我当时的想法:-)你在子程序语句中遗漏了伪参数。您应该有子例程stack2(f)
。感谢您提供的有用注释。p是一个语句函数-一种过时的语法,现在应该避免使用。这里有一个包含的子程序可以完成这项工作。非常感谢。你肯定已经指出了错误,但是你能提出一个解决方案来解决这个问题吗?我也在寻找解决办法。Thanks@Ian布什感谢你指出旧的符号。如何实现子程序?谢谢