主题:关于fortran中子程序参数传递问题
rode
[专家分:0] 发布于 2011-12-14 14:53:00
大家好,我最近学习fortran中,有几个问题总不太明白,请教一下大家
1.fortran中给子程序传递参数是传的内存地址,也就是说,如果子程序在调用过程中改变了某个已有确定值的变量,这个变化将在调用程序中保存下来。但有时我们并不想这样,怎么办?是不是得在子程序中声明一个临时变量去接收这个传递的参数值代替参与子程序的运行,而不去改变传递进来的我们不想改变的内存? 觉得这样会导致过多变量,使代码可读性差。 不知道有没有什么其它办法? 另外,能不能这样,出于保险起见,对那些在子程序运行中不应该改动的传递参数,声明为常量,当然实型整型要对应上。这样如果由于失误改变了不该改变的程序应该不能运行。不知道实际编程中是不是这样做?
2.我最近要看一些程序代码,有70多个程序文件,有没有什么快速的办法定位它们之间的互相调用关系?已经看了一天了,简直累惨,还没摸出头脑。
烦请高手解惑,我对编程不是很在行,谢谢。
回复列表 (共12个回复)
沙发
alsoran [专家分:760] 发布于 2011-12-14 15:21:00
1.子程序的总要改变一些值啊~用函数代替子程序,另外不该改动的参数用intent(in)定义
2.看大程序貌似先画流程图,先看模块的输入输出
我等抛砖引玉来了……
板凳
rode [专家分:0] 发布于 2011-12-14 16:24:00
[quote]1.子程序的总要改变一些值啊~用函数代替子程序,另外不该改动的参数用intent(in)定义
2.看大程序貌似先画流程图,先看模块的输入输出
我等抛砖引玉来了……[/quote]
谢谢,我说的只是针对不想修改的,但子程序执行过程中可能会改动,但主程序中想用原来的值。另外,是不是用了intent(in)之后,这个参数值在子程序运行过程中就不能被修改了,否则报错?
关键是这个程序流程图怎么画,没有头绪,我只有程序代码,怎么先弄明白互相调用关系?
3 楼
rode [专家分:0] 发布于 2011-12-14 16:52:00
[quote]1.子程序的总要改变一些值啊~用函数代替子程序,另外不该改动的参数用intent(in)定义
2.看大程序貌似先画流程图,先看模块的输入输出
我等抛砖引玉来了……[/quote]
我已经找到了关于intent的相关资料了,你说得对,用intent(in)可以设定相关参数变量为只读。这个功能不错。
4 楼
臭石头雪球 [专家分:23030] 发布于 2011-12-14 16:54:00
1.你可以用 value 来保证传值,而不是传址。
比如
Subroutine SubA( dumArgc1 , dumArgc2 )
Integer , value :: dumArgc1
这样 dumArgc1 这个虚参就是传值的了。
2.用 intent(in) 以后,如果你试图改变它的值,就会报错
3.某些工具可以做这样的流程图,自动的,但是我没有找到合适 Fortran 的这种软件。其他学长有的话,请分享一下。
5 楼
rode [专家分:0] 发布于 2011-12-14 17:14:00
[quote]1.你可以用 value 来保证传值,而不是传址。
比如
Subroutine SubA( dumArgc1 , dumArgc2 )
Integer , value :: dumArgc1
这样 dumArgc1 这个虚参就是传值的了。
2.用 intent(in) 以后,如果你试图改变它的值,就会报错
3.某些工具可以做这样的流程图,自动的,但是我没有找到合适 Fortran 的这种软件。其他学长有的话,请分享一下。[/quote]
哇,原来还可以传值。这个很好,谢谢MM。 真有可以自动做流程图的工具?我都基本不抱希望了,我去搜下看看。
6 楼
adda [专家分:1520] 发布于 2011-12-14 18:18:00
[quote][quote]1.你可以用 value 来保证传值,而不是传址。
比如
Subroutine SubA( dumArgc1 , dumArgc2 )
Integer , value :: dumArgc1
这样 dumArgc1 这个虚参就是传值的了。
2.用 intent(in) 以后,如果你试图改变它的值,就会报错
3.某些工具可以做这样的流程图,自动的,但是我没有找到合适 Fortran 的这种软件。其他学长有的话,请分享一下。[/quote]
哇,原来还可以传值。这个很好,谢谢MM。 真有可以自动做流程图的工具?我都基本不抱希望了,我去搜下看看。[/quote]
understand for fortran
7 楼
cgl_lgs [专家分:21040] 发布于 2011-12-19 16:04:00
雪球兄是男滴~~~~~
8 楼
dongyuanxun [专家分:7180] 发布于 2011-12-19 17:47:00
LS性别不明
9 楼
cgl_lgs [专家分:21040] 发布于 2011-12-20 11:47:00
[quote]LS性别不明[/quote]那是因为你暗恋我:)哈哈:)
10 楼
ralph1234 [专家分:20] 发布于 2011-12-28 23:38:00
我觉得就用intent(in)和intent(out)就挺清楚的了啊。。
我来回复