Fortran Coder

标题: 调用函数时报错 [打印本页]

作者: fortran小学生    时间: 2018-1-14 23:24
标题: 调用函数时报错
使用vs编译
错误显示为the rank of the function reference does not match the rank of the function definition.请教大家这是什么意思?

作者: kyra    时间: 2018-1-15 07:51
函数的引用和函数的定义,维度不一样。
具体需给出代码确定
作者: fortran小学生    时间: 2018-1-15 10:15
kyra 发表于 2018-1-15 07:51
函数的引用和函数的定义,维度不一样。
具体需给出代码确定

您好,我写了一段函数,返回值是数组类型,然后调用的语句报错。我把代码发在楼下。

作者: fortran小学生    时间: 2018-1-15 10:18
错误行应该是第20行(x=work(a,c,d,y,nmax))
[Fortran] 纯文本查看 复制代码
subroutine absorption(p0,p,m,lamda,kmax,mmax,nmax)
!solve the second part
implicit none
integer :: i,m
integer :: kmax,mmax,nmax
real,dimension(kmax,mmax,nmax) :: p,p0
real,dimension(nmax):: x,y
real,dimension(nmax):: a,c,d
real,external :: work
! y-p_m,x-p_m+1
real :: lamda

do i=1,nmax
    a(i)=-lamda
    c(i)=-lamda
    d(i)=1+2*lamda
end do
do i=1,kmax
    y=p0(i,m,:)
    x=work(a,c,d,y,nmax)
    p(i,m,:)=x(:)
end do
end subroutine absorption


另外work函数的代码是:
[Fortran] 纯文本查看 复制代码
function work(a,c,d,b,ranka)
! lamda-matrix A;y-right side;m-A(rank-1*rank-1)
implicit none
integer ranka,i
real,dimension(ranka):: a,c,d,work,y,b,r,delta,beta
!real :: lamda,d,c,a
!d=1+2*lamda
!a=-lamda
!c=-a
r(1)=d(1)
delta(1)=c(1)/r(1)
y(1)=b(1)/r(1)
do i=2,ranka
   beta(i)=a(i)
   r(i)=d(i)-beta(i)*delta(i-1)
   delta(i)=c(i)/r(i)
   y(i)=(b(i)-beta(i)*y(i-1))/r(i)
end do
! step1:Ly=b

work(ranka)=y(ranka)
do i=ranka-1,1,-1
    work(i)=y(i)-delta(i)*work(i+1)
end do
! step2:Ux(work)=y
end function work

作者: fortran小学生    时间: 2018-1-15 10:47
问题似乎是:fortran函数返回值为数组,应该传递到另一个数组里呢?
作者: kyra    时间: 2018-1-15 11:10
返回值是数组,则不能用
real , external :: work
来定义。

实际上,我们都不再用 external 来定义外部函数了。可以用 interface,但是它会比较麻烦,所以现在都用 module 封装,这样可以不写 interface

[Fortran] 纯文本查看 复制代码
module workMod
  
contains

function work(a,c,d,b,ranka)
! lamda-matrix A;y-right side;m-A(rank-1*rank-1)
implicit none
integer ranka,i
real,dimension(ranka):: a,c,d,work,y,b,r,delta,beta
!real :: lamda,d,c,a
!d=1+2*lamda
!a=-lamda
!c=-a
r(1)=d(1)
delta(1)=c(1)/r(1)
y(1)=b(1)/r(1)
do i=2,ranka
   beta(i)=a(i)
   r(i)=d(i)-beta(i)*delta(i-1)
   delta(i)=c(i)/r(i)
   y(i)=(b(i)-beta(i)*y(i-1))/r(i)
end do
! step1:Ly=b

work(ranka)=y(ranka)
do i=ranka-1,1,-1
    work(i)=y(i)-delta(i)*work(i+1)
end do
! step2:Ux(work)=y
end function work

end module workMod

subroutine absorption(p0,p,m,lamda,kmax,mmax,nmax)
use workMod
implicit none
integer :: i,m
integer :: kmax,mmax,nmax
real,dimension(kmax,mmax,nmax) :: p,p0
real,dimension(nmax):: x,y
real,dimension(nmax):: a,c,d
! y-p_m,x-p_m+1
real :: lamda

do i=1,nmax
    a(i)=-lamda
    c(i)=-lamda
    d(i)=1+2*lamda
end do
do i=1,kmax
    y=p0(i,m,:)
    x=work(a,c,d,y,nmax)
    p(i,m,:)=x(:)
end do
end subroutine absorption

作者: fortran小学生    时间: 2018-1-15 12:10
kyra 发表于 2018-1-15 11:10
返回值是数组,则不能用
real , external :: work
来定义。

谢谢。我后来改写成子程序了。module语句我没用过,还在学习




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2