CyRhmU.jpeg
查看: 2992  |  回复: 13
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

songjunann

铜虫 (小有名气)

[求助] Fortran的subroutine和function有什么区别,是在于输入输出的特点吗?

Fortran的subroutine和function有什么区别,我看到有的网页上说是在于输入输出的特点: 即function只能允许一个输出,而subroutine可以有很多输出?是这样吗?

比如一个函数

function   monsim(x,...)

.....

是不是输出变量只能是monisim?
如果x值有变化吗?即输入的x是一个值,但是function里面有关于x的赋值表达式,使得x值发生变化,那么是否 在主程序中call  monsim(x,...),会同时读到新的x值
和monsim的值? (因为我看很多function里面都把输出的结果变量名设成和函数一样的名字)。 请多多指教,谢谢!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

songjunann

铜虫 (小有名气)

引用回帖:
7楼: Originally posted by snoopyzhao at 2012-03-25 09:44:06:
原则上,如果有改变程序中其它变量的情况都应该用 subroutine。function 最好不要有 side effect……

请问,什么是side effect? 谢谢
10楼2012-03-28 12:30:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 14 个回答

lurencyj

木虫 (著名写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
jjdg: 金币+1, 感谢参与 2012-03-25 01:41:48
songjunann: 金币+20, ★★★很有帮助, 谢谢 2012-03-28 12:29:30
余泽成: 专家考核 2012-03-30 14:07:28
function接受多个参数,返回一个计算结果。调用的时候,可以直接插入表达式,比如x = AVRAGE(a,b,c)。function AVRAGE 的构造如下:
CODE:
REAL FUNCTION AVRAGE(X,Y,Z)
     REAL X,Y,Z,SUM
     SUM = X + Y + Z
     AVRAGE = SUM /3.0
     RETURN
END

Subroutine适用在当需要返回多个变量数值的情形,但是,调用subroutine的时候,只能用call语句,不能像function那样直接插入表达式。 下面这个subroutine是对A,B,C的求和,以及求和的平方。用call语句调用后,位于sum和sumsq的变量将被改变数值:
CODE:
SUBROUTINE CALC(A,B,C, SUM,SUMSQ)
           REAL A,B,C,SUM,SUMSQ
           SUM = A + B + C
           SUMSQ = SUM **2
           RETURN
END

很女子很弓虽大
2楼2012-03-25 00:32:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

songjunann

铜虫 (小有名气)

引用回帖:
2楼: Originally posted by lurencyj at 2012-03-25 00:32:14:
function接受多个参数,返回一个计算结果。调用的时候,可以直接插入表达式,比如x = AVRAGE(a,b,c)。function AVRAGE 的构造如下:

REAL FUNCTION AVRAGE(X,Y,Z)
     REAL X,Y,Z,SUM
     SUM = X + Y + Z ...

恩,谢谢,我明白了,还有个小问题,
关于subroutine的程序,接受的参数以及返回的变量的数值,是不是都要写在
()里,如 subroutine  calc(A,B,C,sum,...), 我们要判断输入参数,和输出变量都可从(A,B,C,sum,....)里面去判断,因为有时候看别人的程序,不知道输出的是那些,不可能子程序里面有赋值的变量都会输出,是吧?
3楼2012-03-25 03:05:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)

【答案】应助回帖

★ ★
zzy870720z: 金币+2, 专家考核, 谢谢指教 2012-03-25 14:59:37
你可以自己做个测试。呵呵。

如何判断参数是否为输出性质的变量,这个从subroutine 的参数列表()里面是看不出来的,除非在给它们取名字时就标识清楚。

Subroutine里面有赋值的变量确实都会输出!

[ 发自手机版 http://muchong.com/3g ]
很女子很弓虽大
4楼2012-03-25 05:34:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见