fortran函数重载

    某些情况下,我们需要对不同类型或不同数量的参数做相似或相同的操作,由于参数类型、数量不同,我们需要编写不同的函数来处理。比如求绝对值,如果参数是4字节整数,我们需要调用iabs函数;如果参数是4字节或8字节实数,我们需要分别调用sabs或dabs函数。由于需要记住多个功能相同或相近的函数,增加了我们使用这些函数的难度,同时也增加了出错的可能性,比如将实数传递给iabs函数。
    上述函数的功能相同,只是参数类型或个数不同,那么可否使用同一个函数名来执行它们呢?当然可以,这就是函数重载。
    函数重载允许通过调用通用过程名来执行特定函数。当用户调用通用过程名时,编译器首先检查传入参数的类型和数量,再调用与之匹配(类型和数量相同)的特定函数来执行具体任务。例如我们建立通用过程名abs 来求绝对值,用户在任何情况都只需调用abs,编译器会自动选用合适的特定函数执行对应操作:当传入参数是4 字节整数,就调用iabs函数;如果是8 字节实数,则调用dabs函数。
    下面用求绝对值的例子说明函数重载功能。为与Fortran内在函数abs区别开来,我们在函数名后添加“_f”
    下面给出实例代码:

module abs_module
    implicit none
    interface abs_f
        module procedure sabs_f, dabs_f, iabs_f
    end interface abs_f
contains
    function sabs_f(x)
        implicit none 
        real(4) sabs_f, x
        if( x < 0.0_4 ) then
            sabs_f = -x
        else
            sabs_f = x
        end if
    end function sabs_f
    
    function dabs_f(x)
        implicit none
        real(8) dabs_f, x
        if( x < 0.0_8 ) then
            dabs_f = -x
        else
            dabs_f = x
        end if
    end function dabs_f
        
    function iabs_f(x)
        implicit none 
        integer(4) iabs_f, x
        if( x < 0 ) then
            iabs_f = -x
        else
            iabs_f = x
        end if
    end function iabs_f
end module abs_module

program Fcode_cn
    use abs_module
    real(4) :: x = -2.0_4
    real(8) :: y = -3.0_8
    integer(4) :: z = -4
    print*, sabs_f(x), dabs_f(y), iabs_f(z)
    print*, abs(x), abs(y), abs(z)  
end program 
执行结果如下:
  2.00000000       3.0000000000000000                4
  2.00000000       3.0000000000000000                4
    这里强调一下:模块中interface的名字可以和procedure中的名称相同,但是不建议这样做。建议给interface起一个不同于procedure的名字或是直接不起名字。
    因为interface的名字与procedure中的一个名字相同时,此时这个相同名字的procedure可以接收其他procedure中的变量类型,这样也就失去了函数重载的意义。

猜你喜欢

转载自blog.csdn.net/chd_lkl/article/details/84479308
今日推荐