fortran - 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
解决方案
我将首先解决您的错误消息。然后我会指出我看到的其他一些问题,并尝试建议您如何选择寻求解决方案。
- 错误 1:符号不是虚拟变量。这是因为在程序
stack2
中使用参数调用子例程stackproblem
。但是,stack2
在其定义中没有参数。f
仅用with声明变量intent(inout)
是不够的,并且可能会导致其他错误消息。 - 错误 2:旧版扩展:REAL 数组索引。请注意,
f
模块stack1
被声明为二维real
值数组。当然,可以使用f(row,col)
whererow
是行号和col
是列号来访问数组中的每个元素。此外,row,col
应该是整数。但是,在子例程中,stack2
您正在使用real
值访问数组的元素。我相信根本问题是你把f
它当作一个函数来对待——但事实并非如此。
现在,您没有提及任何其他问题,但似乎存在其他问题和误解。这是一个:
- 变量 (?) 函数 (?)
p
未声明/定义。既然你已经使用implicit none
了,这也应该会导致编译器错误。
推荐阅读
- android - Android 应用录制的视频无法打开任何外部播放器。错误是无法播放此链接
- css - Tailwind CSS:在图像悬停时显示文本
- arrays - 在 VBA 中为不同的数组着色
- javascript - 想要根据选择值动态更改输入值中的“onChange”属性,后缀为
- powershell - Powershell Citrix ShareFile API 上传
- stripe-payments - 将 PaymentIntent 链接到产品
- visual-studio - Visual Studio Check In Policy in combination with .NET analyzers
- c# - 如何升级 System.Security.Cryptography 程序集版本以从 4.0 in.net 框架指向 5.0
- php - 问题取消与 Drupal 9.0.3 的链接
- django - 在 django 中避免两个 forloop 的任何有效方法