fortran里面subroutine子程序不是不用声明吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fortran里面subroutine子程序不是不用声明吗?相关的知识,希望对你有一定的参考价值。
fortran里面的subroutine在main里面不用声明啊,但是为什么我看到有的程序里面会加上external func。其中func是subroutine。这个问题有点转牛角尖。。。望高手解答
subroutine 不用声明external 用来申明函数,通常在容易混淆的地方,例如 a = func(b) 的时候,编译器可能会认为 func 是个数组,此时,一些人习惯用 external func 来强调 func 是个函数。
subroutine 不需要声明,call func(b) 编译器不会搞错的。
其实更好的办法是写 interface追问
大姐。我当然知道subroutine不用声明,只是我看到一个正确的程序却声明了!
追答不用,跟 不能。
你能区别意思有何不同么?
我不用每天都给父母打电话。
不代表:
我不能每天都给父母打电话。
唉,语文没学好
不用声明。
external 用来申明函数,通常在容易混淆的地方,例如 a = func(b) 的时候,编译器可能会认为 func 是个数组,此时,一些人习惯用 external func 来强调 func 是个函数。
subroutine 不需要声明,call func(b) 编译器不会搞错的。
参考技术B 同一楼,关于各种编译器的异同点,使用最稳妥的语法语言来编写代码是最好的,external可以避免某些由于编译器的差异带来的问题,提倡多多使用。还有,external后边可以跟subroutine,也可以跟function。
interface是另一种方式,属于稍微不常用的语法,个人经验不建议使用。
什么是fortran函数
什么是fortran函数
参考技术A fortran是一种编程语言,跟C、C++一样,如果理解C函数或者C++函数的话,就就理解了这个 参考技术B Fortran中函数分两类:子程序(subroutine)和自定义函数(function)。自定义函数本质上就是数学上的函数,一般要传递自变量给自定义函数,返回函数值。子程序不一定是这样,可以没有返值。传递参数要注意类型的对应,这跟C是一样的。1、子程序
目的:把某一段经常使用的有特定功能的程序独立出来,可以方便调用。
习惯上一般都把子程序放在主程序结束之后。
形式:
subroutine name (parameter1, parameter2)
!给子程序起一个有意义的名字。可以传递参数,这样可以有返回值。括号内也可以空着,代不传递参数。
implicit none
integer:: parameter1, parameter2 !需要定义一下接收参数的类型。
…… !接下来的程序编写跟主程序没有任何别。
……
mreturn !跟C不同,这里表示子程序执行后回到调用它的地方继续执行下面的程序。不一定放
!在最后。可以放在子程序的其他位置,作用相同;子程序中return之后的部分不执行。
end [subroutine name]
调用:使用call命令直接使用,不需要声明。在调用处写:
call subroutine name(parameter1,parameter2)
注意点:
a.子程序之间也可相互调用。直接调用就是了,像在主程序中调用子程序一样。
b.传递参数的原理和C中不同。Fortran里是传址调用(call by address/reference),就是传递时用参数和子程序中接收时用的参数使用同一个地址,尽管命名可以不同。这样如果子程序的执行改子程序中接收参数的值,所传递的参数也相应发生变化。
c.子程序各自内部定义的变量具有独立性,类似于C。各自的行代码也具有独立性。因此各个子程序主程序中有相同的变量名、行代码号,并不会相互影响。
2、自定义函数
和子程序的明显不同在于:需要在主程序中声明之后才能使用。调用方式也有差别。另外按照惯例用函数不去改变自变量的值。如果要改变传递参数的值,习惯上用子程序来做。
声明方式:real, external :: function_name
一般自定义函数也是放在主程序之后。
形式:
function function_name(parameter1, parameter2)
implicit none
real:: parameter1, parameter2 !声明函数参数类型,这是必需的
real::function_name !声明函数返回值类型,这是必需的
……
……
function_name=…. !返回值的表达式
return
end
也可以这样直接声明返回值类型,简洁些:
real function function_name(parameter1, parameter2)
implicit none
real:: parameter1, parameter2 !这个还是必需的
……
……
function_name=…. !返回值表达式
return
end
调用:function_name(parameter1,parameter2)
不需要call命令。
自定义函数可以相互调用。调用时也需要事先声明。
总之,调用自定义函数前需要做声明,调用子程序则不需要。
参考资料:网上搜索《Fortran 95 程序设计》读书笔记
本回答被提问者采纳以上是关于fortran里面subroutine子程序不是不用声明吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用MinGW gfortran通过CMake构建/编译Fortran