Fortran Coder

查看: 8888|回复: 2
打印 上一主题 下一主题

[子程序] 子程序的某个形参是函数

[复制链接]

17

帖子

6

主题

0

精华

入门

F 币
107 元
贡献
54 点
跳转到指定楼层
楼主
发表于 2018-6-13 23:24:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
有一段程序:
[Fortran] 纯文本查看 复制代码
01program ode
02use rksuite_90
03implicit none
04……
05external::f
06dimension(2)::f
07……
08call range_integrate_r1(comm,f,t_want,t_got,y_got,yderiv_got,flag)
09stop
10end program ode
11 
12function f(t,y)
13use rksuite_90
14implicit none
15real(kind=wp)::t
16real(kind=wp)::y(2)
17real(kind=wp)::f(2)     !声名返回值类型
18f(1)=y(2)
19f(2)=-y(1)
20end function

module如下。
[Fortran] 纯文本查看 复制代码
01module rksuite_90
02……
03recursive subroutine range_integrate_r1(comm,f,t_want,t_got,y_got,yderiv_got,flag)
04interface
05      function f(t,y)
06      use rksuite_90_prec, only:wp
07      real(kind=wp), intent(in) :: t                                 !indep!
08      real(kind=wp), dimension(:), intent(in) :: y                   !dep!
09      real(kind=wp), dimension(size(y,1)) :: f                       !dep!
10       
11   end function f
12 
13end interface
14……
15comm%yp = f(comm%t,comm%y)
16……
17end module rksuite_90

range_integrate_r1中的形参f是个function,由于 f 在module中的定义是dimension形式的,见module代码,(size=2),
所以需要将 f 以external且以一个数组的形式传给range_integrate_r1,请问应怎么做?
f(t,y)中的形参数值是在其他子程序中给定的,见module代码(语句为comm%yp = f(comm%t,comm%y)),不能我自己定义
我用
[Fortran] 纯文本查看 复制代码
1external::f
2dimension(2)::f
在主程序定义以后,程序报错如图

捕获.PNG (9.05 KB, 下载次数: 365)

捕获.PNG
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

132

帖子

11

主题

0

精华

大师

F 币
625 元
贡献
377 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

沙发
发表于 2018-6-14 00:57:54 | 只看该作者
[Fortran] 纯文本查看 复制代码
01module rksuite_90_prec
02  implicit none
03  integer, parameter :: wp=selected_real_kind(P=15)
04end module rksuite_90_prec
05 
06module rksuite_90
07  implicit none
08contains
09  recursive subroutine range_integrate_r1(comm,f,t_want,t_got,y_got,yderiv_got,flag)
10    implicit none
11    real :: comm, t_want, t_got, y_got, yderiv_got, flag
12    interface
13       function f(t,y)
14          use rksuite_90_prec, only:wp
15          implicit none
16          real(kind=wp), intent(in) :: t
17          real(kind=wp), dimension(:), intent(in) :: y
18          real(kind=wp), dimension(size(y,1)) :: f
19       end function f
20    end interface
21    !...
22  end subroutine range_integrate_r1
23end module rksuite_90
24 
25program ode
26  use rksuite_90
27  implicit none
28  real :: comm, t_want, t_got, y_got, yderiv_got, flag
29  interface
30     function f(t,y)
31       use rksuite_90_prec, only:wp
32       implicit none
33       real(kind=wp), intent(in) :: t
34       real(kind=wp), dimension(:), intent(in) :: y
35       real(kind=wp), dimension(size(y,1)) :: f
36     end function f
37  end interface
38 
39  call range_integrate_r1(comm,f,t_want,t_got,y_got,yderiv_got,flag)
40 
41end program ode
42 
43function f(t,y)
44  use rksuite_90_prec, only:wp
45  implicit none
46  real(kind=wp), intent(in) :: t
47  real(kind=wp), dimension(:), intent(in) :: y
48  real(kind=wp), dimension(size(y,1)) :: f
49  f(1) = y(2)
50  f(2) =-y(1)
51end function f

17

帖子

6

主题

0

精华

入门

F 币
107 元
贡献
54 点
板凳
 楼主| 发表于 2018-6-14 08:10:43 | 只看该作者
谢谢!没系统学过fortran,不知到interface还能这么用……真的谢谢啦
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-30 01:22

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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