Fortran Coder

查看: 13715|回复: 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.请教大家这是什么意思?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

268

帖子

0

主题

0

精华

版主

World Analyser

F 币
749 元
贡献
526 点

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

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] 纯文本查看 复制代码
01subroutine absorption(p0,p,m,lamda,kmax,mmax,nmax)
02!solve the second part
03implicit none
04integer :: i,m
05integer :: kmax,mmax,nmax
06real,dimension(kmax,mmax,nmax) :: p,p0
07real,dimension(nmax):: x,y
08real,dimension(nmax):: a,c,d
09real,external :: work
10! y-p_m,x-p_m+1
11real :: lamda
12 
13do i=1,nmax
14    a(i)=-lamda
15    c(i)=-lamda
16    d(i)=1+2*lamda
17end do
18do i=1,kmax
19    y=p0(i,m,:)
20    x=work(a,c,d,y,nmax)
21    p(i,m,:)=x(:)
22end do
23end subroutine absorption


另外work函数的代码是:
[Fortran] 纯文本查看 复制代码
01function work(a,c,d,b,ranka)
02! lamda-matrix A;y-right side;m-A(rank-1*rank-1)
03implicit none
04integer ranka,i
05real,dimension(ranka):: a,c,d,work,y,b,r,delta,beta
06!real :: lamda,d,c,a
07!d=1+2*lamda
08!a=-lamda
09!c=-a
10r(1)=d(1)
11delta(1)=c(1)/r(1)
12y(1)=b(1)/r(1)
13do i=2,ranka
14   beta(i)=a(i)
15   r(i)=d(i)-beta(i)*delta(i-1)
16   delta(i)=c(i)/r(i)
17   y(i)=(b(i)-beta(i)*y(i-1))/r(i)
18end do
19! step1:Ly=b
20 
21work(ranka)=y(ranka)
22do i=ranka-1,1,-1
23    work(i)=y(i)-delta(i)*work(i+1)
24end do
25! step2:Ux(work)=y
26end function work

10

帖子

3

主题

0

精华

入门

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

268

帖子

0

主题

0

精华

版主

World Analyser

F 币
749 元
贡献
526 点

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

QQ
6#
发表于 2018-1-15 11:10:00 | 只看该作者
返回值是数组,则不能用
real , external :: work
来定义。

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

[Fortran] 纯文本查看 复制代码
01module workMod
02   
03contains
04 
05function work(a,c,d,b,ranka)
06! lamda-matrix A;y-right side;m-A(rank-1*rank-1)
07implicit none
08integer ranka,i
09real,dimension(ranka):: a,c,d,work,y,b,r,delta,beta
10!real :: lamda,d,c,a
11!d=1+2*lamda
12!a=-lamda
13!c=-a
14r(1)=d(1)
15delta(1)=c(1)/r(1)
16y(1)=b(1)/r(1)
17do i=2,ranka
18   beta(i)=a(i)
19   r(i)=d(i)-beta(i)*delta(i-1)
20   delta(i)=c(i)/r(i)
21   y(i)=(b(i)-beta(i)*y(i-1))/r(i)
22end do
23! step1:Ly=b
24 
25work(ranka)=y(ranka)
26do i=ranka-1,1,-1
27    work(i)=y(i)-delta(i)*work(i+1)
28end do
29! step2:Ux(work)=y
30end function work
31 
32end module workMod
33 
34subroutine absorption(p0,p,m,lamda,kmax,mmax,nmax)
35use workMod
36implicit none
37integer :: i,m
38integer :: kmax,mmax,nmax
39real,dimension(kmax,mmax,nmax) :: p,p0
40real,dimension(nmax):: x,y
41real,dimension(nmax):: a,c,d
42! y-p_m,x-p_m+1
43real :: lamda
44 
45do i=1,nmax
46    a(i)=-lamda
47    c(i)=-lamda
48    d(i)=1+2*lamda
49end do
50do i=1,kmax
51    y=p0(i,m,:)
52    x=work(a,c,d,y,nmax)
53    p(i,m,:)=x(:)
54end do
55end 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, 2025-5-1 06:09

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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