首页 > 解决方案 > Fortran 中的调试子程序

问题描述

我正在尝试调试涉及子例程和模块的代码。我从子例程中收到两条错误消息:1)符号不是虚拟变量,2)旧版扩展:REAL 数组索引。我在代码中指出了错误的来源。

主程序读入一个包含一列数字的文件。然后我使用这个文件作为参数调用子程序。然后子例程给了我这两个错误消息。如何修复我的代码,从而修复这些错误消息?谢谢

注意:我根据下面有用的评论编辑了代码。我仍然收到相同的错误消息。

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

标签: fortran

解决方案


我将首先解决您的错误消息。然后我会指出我看到的其他一些问题,并尝试建议您如何选择寻求解决方案。

  1. 错误 1:符号不是虚拟变量。这是因为在程序stack2中使用参数调用子例程stackproblem。但是,stack2在其定义中没有参数。f仅用with声明变量intent(inout)是不够的,并且可能会导致其他错误消息。
  2. 错误 2:旧版扩展:REAL 数组索引。请注意,f模块stack1被声明为二维real值数组。当然,可以使用f(row,col)whererow是行号和col是列号来访问数组中的每个元素。此外,row,col应该是整数。但是,在子例程中,stack2您正在使用real值访问数组的元素。我相信根本问题是你把f它当作一个函数来对待——但事实并非如此。

现在,您没有提及任何其他问题,但似乎存在其他问题和误解。这是一个:

  • 变量 (?) 函数 (?)p未声明/定义。既然你已经使用implicit none了,这也应该会导致编译器错误。

推荐阅读