Fortran中subroutine和function的区别

https://www.cnblogs.com/qianjiashi/articles/13667334.html

二者均是被program调用,完成一定的任务,但是二者有明显的不同:
1. subroutine不需要在program中声明,但是在调用时必须用Call命令;与此相反,function必须在program中声明,在调用时不用任何命令,因为函数名本身就是命令
2. subroutine可以不返回什么结果,但是function必须返回计算结果

附:
   function声明格式, real, external :: function_name  !声明function_name 是个函数,返回结果是real类型。
  在函数定义中也必须指定function_name的数据类型,比如:

   function_name(a1, a2, a3, ....)
   ......
   real :: function_name
   .....

   end

3. 使用function有一个“不成文的规定”,就是:“传递给函数的参数,只要读取它的数值就好了,不要去改变它的数据”。虽然在语法上可以改变输入它的数据,但是输入函数的参数就是所谓的“自变量”,而函数返回的值是“应变量”。“自变量”是自由变化的,它的值应该不会在使用函数的过程中被改变。如果想要改变输入的参数时,最好使用子程序,而不是使用函数来完成这个工作。

 

复制代码

 DOUBLE PRECISION FUNCTION D1MACH(I)                                                    
C                                                                                           
C  DOUBLE-PRECISION MACHINE CONSTANTS                                                        C                                                                                            
C  D1MACH( 1) = B**(EMIN-1), THE SMALLEST POSITIVE MAGNITUDE.                                C                                                                                            
C  D1MACH( 2) = B**EMAX*(1 - B**(-T)), THE LARGEST MAGNITUDE.                                C                                                                                            
C  D1MACH( 3) = B**(-T), THE SMALLEST RELATIVE SPACING.                                      C                                                                                            
C  D1MACH( 4) = B**(1-T), THE LARGEST RELATIVE SPACING.                                      C                                                                                            
C  D1MACH( 5) = LOG10(B)          

复制代码

复制代码

SUBROUTINE FDUMP                                                                       
C***BEGIN PROLOGUE  FDUMP                                                                    
C***PURPOSE  Symbolic dump (should be locally written).                                      
C***LIBRARY   SLATEC (XERMSG)                                                               
C***CATEGORY  R3                                                                             
C***TYPE      ALL (FDUMP-A)                                                                  
C***KEYWORDS  ERROR, XERMSG                                                                  
C***AUTHOR  Jones, R. E., (SNLA)                                                             
C***DESCRIPTION 

复制代码

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FortranSUBROUTINEFUNCTION都可以用来定义子程序,但它们之间有一些区别。 1. 返回值类型 FUNCTION可以返回一个值,而SUBROUTINE不返回任何值。因此,FUNCTION的定义必须包含返回值的类型,而SUBROUTINE则不需要。 例如,以下是一个返回整数类型的函数定义: ``` FUNCTION add(a, b) RESULT(c) INTEGER :: a, b, c c = a + b END FUNCTION ``` 而以下是一个不返回任何值的子程序定义: ``` SUBROUTINE print_hello() PRINT *, "Hello, world!" END SUBROUTINE ``` 2. 调用方式 调用SUBROUTINE时,使用CALL语句来调用,而调用FUNCTION时,可以直接将其当作一个表达式来使用。因此,调用FUNCTION时,不需要使用CALL语句。 例如,以下是调用SUBROUTINE的语句: ``` CALL print_hello() ``` 而以下是调用FUNCTION的语句: ``` result = add(2, 3) ``` 3. 参数传递 在FortranSUBROUTINEFUNCTION都支持值传递和引用传递两种参数传递方式。但是,由于FUNCTION需要返回一个值,因此通常情况下,它需要使用引用传递来返回值。 例如,以下是一个使用值传递的子程序定义: ``` SUBROUTINE swap(a, b) INTEGER :: a, b, temp temp = a a = b b = temp END SUBROUTINE ``` 而以下是一个使用引用传递的函数定义: ``` FUNCTION max(a, b) RESULT(c) INTEGER :: a, b, c IF (a > b) THEN c = a ELSE c = b END IF END FUNCTION ``` 在调用SUBROUTINEFUNCTION时,使用不同的语法来传递参数。例如,以下是调用使用值传递的子程序的语句: ``` CALL swap(a, b) ``` 而以下是调用使用引用传递的函数的语句: ``` result = max(a, b) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值