Fortran Coder

查看: 3119|回复: 4
打印 上一主题 下一主题

[子程序] 不能传递子程序名字

[复制链接]

3

帖子

1

主题

0

精华

新人

F 币
30 元
贡献
15 点
跳转到指定楼层
楼主
发表于 2021-12-13 21:41:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
env:ubuntu 20.04+ifort
CODE:
[Fortran] 纯文本查看 复制代码
01program  main
02  CALL B()
03  CALL FKB(B)
04 
05 
06contains
07   subroutine B()
08   IMPLICIT NONE
09   write (*,*) 'fk'
10   end subroutine B
11 
12   subroutine FKB(fcn)
13   implicit none
14   INTERFACE
15      SUBROUTINE fcn()
16      IMPLICIT NONE
17      END SUBROUTINE fcn
18   END INTERFACE
19   write (*,*) '1'
20   call B()
21   write (*,*) '2'
22   call fcn()
23   write (*,*) '3'
24   end subroutine FKB
25 
26end

很简单的程序,把子程序名字‘B' 通过'fcn'传递给子程序'FKB'里,编译也不报错,但是运行以后发现

ifort -g main.F90
./a.out

fk
1
fk
2
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image              PC                Routine            Line        Source
a.out              000000000040490A  Unknown               Unknown  Unknown
libpthread-2.31.s  00007F86D9BE53C0  Unknown               Unknown  Unknown
Unknown            00007FFFF6983F50  Unknown               Unknown  Unknown


显然调用'fcn'的时候出现了问题。
请问这到底是为什么?如何解决?


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

3

帖子

1

主题

0

精华

新人

F 币
30 元
贡献
15 点
沙发
 楼主| 发表于 2021-12-13 22:05:19 | 只看该作者
或者有人能帮我试着跑一下可以么,看看报不报错

268

帖子

0

主题

0

精华

版主

World Analyser

F 币
749 元
贡献
526 点

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

QQ
板凳
发表于 2021-12-14 08:28:18 | 只看该作者
gfortran处理主程序contains下的函数有特殊的方式。
你把 subroutine B 放到 program 外面去就行了,或者放到一个module里。

另外的问题,建议用 Procedure 代替子程序内的 interface

[Fortran] 纯文本查看 复制代码
01Module fcnMod
02  Interface
03    Subroutine IF_fcn()
04    End Subroutine IF_fcn
05  End Interface
06contains
07   subroutine B()
08     write (*,*) 'fk'
09   end subroutine B
10End Module fcnMod
11 
12program  main
13  use fcnMod
14  IMPLICIT NONE
15 
16  CALL B()
17  CALL FKB(B)
18   
19contains
20 
21   subroutine FKB(fcn)
22     Procedure(IF_fcn) :: fcn
23     write (*,*) '1'
24     call B()
25     write (*,*) '2'
26     call fcn()
27     write (*,*) '3'
28   end subroutine FKB
29    
30end

或者
[Fortran] 纯文本查看 复制代码
01Subroutine C()
02  write (*,*) 'fc'
03End Subroutine C
04 
05program  main
06  IMPLICIT NONE
07  Interface
08    Subroutine IF_fcn()
09    End Subroutine IF_fcn
10  End Interface
11  Procedure(IF_fcn) :: C
12  CALL C()
13  CALL FKB(C)
14   
15contains
16 
17   subroutine FKB(fcn)
18     Procedure(IF_fcn) :: fcn
19     write (*,*) '1'
20     call C()
21     write (*,*) '2'
22     call fcn()
23     write (*,*) '3'
24   end subroutine FKB
25    
26end

3

帖子

1

主题

0

精华

新人

F 币
30 元
贡献
15 点
地板
 楼主| 发表于 2021-12-14 19:37:32 | 只看该作者
非常有启发性的建议。
实际上我写的东西是一个鲍威尔寻路解非线性方程组的MODULE,所以必须要传递函数名字。
MODULE里面再加MODULE,这个我不确定,但是的确提供了一种思路。
至于用Procedure去替代interface 我都没想过。。。。
太感谢你了,我好好鼓捣鼓捣

268

帖子

0

主题

0

精华

版主

World Analyser

F 币
749 元
贡献
526 点

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

QQ
5#
发表于 2021-12-15 08:26:31 | 只看该作者
不需要module里再加module,在module里(而不是program)就行。可以在同一个module,或者另一个module。

Fortran 应该是不允许module里再写module的。但是module允许有SubModule
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-30 06:09

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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