【问题标题】:Getting error when running subroutine in Fortran在 Fortran 中运行子程序时出错
【发布时间】:2015-08-04 15:45:24
【问题描述】:

我将这些作为运行线性积分的程序的一部分,这是我的函数和子例程,这是问题的一部分

SUBROUTINE interpol(x,f,xd,fd)
IMPLICIT NONE
REAL::linterp
EXTERNAL linterp
REAL,DIMENSION(5)::x
REAL,DIMENSION(5)::f
REAL,DIMENSION(9)::xd
REAL (KIND=8),DIMENSION(9),INTENT(OUT)::fd
INTEGER::i,j
DO i=1, 9
    DO j=1, 5
        IF (x(j) <  xd(i) .AND. xd(i) <=  x(j+1)) THEN
        fd(i)=linterp(x(j),f(j),xd(j))
        END IF
    END DO
END DO
END SUBROUTINE interpol

FUNCTION linterp(xd,x,f)
IMPLICIT NONE
REAL,DIMENSION(5)::xd
REAL,DIMENSION(5)::linterp
REAL,DIMENSION(5)::x
REAL,DIMENSION(5)::f
INTEGER::j,i
linterp=f(i)+((x-x(i)))/(x(i+1)-x(i))*(f(i+1)-f(i))
END FUNCTION linterp

当我运行它时,我无法摆脱这个错误

lin.f90:26:0:

 linterp=f(i)+((x-x(i)))/(x(i+1)-x(i))*(f(i+1)-f(i))
 1
Error: Different shape for array assignment at (1) on dimension 1 (9 and 5)
lin.f90:3:13:

 REAL::linterp
             1
Error: Explicit interface required for ‘linterp’ at (1): array result

我理解错误代码,但我看不出哪里出错了,谁能帮忙? 谢谢

【问题讨论】:

  • 我正在尽力理解这一切,但我对它很陌生,请耐心等待。
  • 不要改变太多问题!它使答案非常混乱......
  • 对于新问题:不要将函数结果定义为数组。这不是计算出来的,并且使事情进一步复杂化。一个简单的real function ... 就足够了。如果您觉得豪华,可以明确定义linterp,但请删除,DIMENSION(5)
  • 您是在编译还是运行时遇到错误?

标签: fortran fortran90 gfortran fortran95


【解决方案1】:

您已将linterp 定义为一个数组!

REAL,DIMENSION(9)::linterp

应该是(标量)函数:

REAL :: linterp
EXTERNAL linterp

你还需要为linterp指定更多参数:

        fd(i)=linterp( x(j), x(j+1), f(j), f(j+1), xx(i) )

【讨论】:

  • 我已经像你说的那样更改了 linter 的定义,但我仍然收到此错误:'lin.f90:3:13: REAL::linterp 1 错误:'linterp 需要显式接口' at (1): 数组结果'
  • @captainlh56 您可能没有按照建议进行更改。该错误可能来自您仍然尝试返回数组而不是标量这一事实。
猜你喜欢
  • 1970-01-01
  • 2018-11-05
  • 2015-08-10
  • 1970-01-01
  • 2019-06-21
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多