Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Fortran语言调试子程序_Fortran - Fatal编程技术网

用Fortran语言调试子程序

用Fortran语言调试子程序,fortran,Fortran,我试图调试我的代码,其中包括一个子例程和一个模块。我从子程序中得到两条错误消息:1)Symbol不是伪变量,2)Legacy Extension:REAL array index。我在代码中指出错误的来源 主程序读入一个包含一列数字的文件。然后我使用这个文件作为参数调用子例程。然后,子程序会给我这两条错误消息。如何修复代码,从而修复这些错误消息?谢谢 注意:我根据下面有用的注释编辑了代码。我仍然收到相同的错误消息 MODULE Stack1 IMPLICIT NONE INTEGER, PAR

我试图调试我的代码,其中包括一个子例程和一个模块。我从子程序中得到两条错误消息:1)Symbol不是伪变量,2)Legacy Extension:REAL array index。我在代码中指出错误的来源

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

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

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
    在其定义中没有参数。仅用
    intent(inout)
    声明变量
    f
    是不够的,可能会导致其他错误消息
  • 错误2:传统扩展:实数数组索引。请注意,模块
    stack1
    中的
    f
    声明为
    REAL
    值的2D数组。当然,可以使用
    f(行,列)
    访问数组中的每个元素,其中
    row
    是行号,
    col
    是列号。此外,
    行、列
    应该是整数。但是,在子例程
    stack2
    中,您使用
    real
    值访问数组的元素。我认为根本的问题是你把
    f
    当作一个函数来对待,但事实并非如此
  • 现在,你没有提到任何其他问题,但似乎还有其他问题和误解。这里有一个:

    • 变量(?)函数(?)
      p
      未声明/定义。由于使用了
      隐式无
      ,这也会导致编译器错误

    我试图首先调试包含子例程和模块的代码,在
    模块
    行之后插入
    隐式无
    ,让编译器检查常见错误源。我个人认为,如果没有安全带,开发代码是在浪费时间;你可能也能猜出我当时的想法:-)你在子程序语句中遗漏了伪参数。您应该有
    子例程stack2(f)
    。感谢您提供的有用注释。p是一个语句函数-一种过时的语法,现在应该避免使用。这里有一个包含的子程序可以完成这项工作。非常感谢。你肯定已经指出了错误,但是你能提出一个解决方案来解决这个问题吗?我也在寻找解决办法。Thanks@Ian布什感谢你指出旧的符号。如何实现子程序?谢谢