Fortran Coder

查看: 13050|回复: 6
打印 上一主题 下一主题

[子程序] 调用函数时报错

[复制链接]

10

帖子

3

主题

0

精华

入门

F 币
78 元
贡献
36 点
跳转到指定楼层
楼主
发表于 2018-1-14 23:24:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用vs编译
错误显示为the rank of the function reference does not match the rank of the function definition.请教大家这是什么意思?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
沙发
发表于 2018-1-15 07:51:54 | 只看该作者
函数的引用和函数的定义,维度不一样。
具体需给出代码确定

10

帖子

3

主题

0

精华

入门

F 币
78 元
贡献
36 点
板凳
 楼主| 发表于 2018-1-15 10:15:08 | 只看该作者
kyra 发表于 2018-1-15 07:51
函数的引用和函数的定义,维度不一样。
具体需给出代码确定

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

10

帖子

3

主题

0

精华

入门

F 币
78 元
贡献
36 点
地板
 楼主| 发表于 2018-1-15 10:18:07 | 只看该作者
错误行应该是第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

10

帖子

3

主题

0

精华

入门

F 币
78 元
贡献
36 点
5#
 楼主| 发表于 2018-1-15 10:47:04 | 只看该作者
问题似乎是:fortran函数返回值为数组,应该传递到另一个数组里呢?

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
6#
发表于 2018-1-15 11:10:00 | 只看该作者
返回值是数组,则不能用
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

10

帖子

3

主题

0

精华

入门

F 币
78 元
贡献
36 点
7#
 楼主| 发表于 2018-1-15 12:10:45 | 只看该作者
kyra 发表于 2018-1-15 11:10
返回值是数组,则不能用
real , external :: work
来定义。

谢谢。我后来改写成子程序了。module语句我没用过,还在学习
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-15 01:21

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表