新语法系列 之 interface 功能详解

您所在的位置:网站首页 fortran作用 新语法系列 之 interface 功能详解

新语法系列 之 interface 功能详解

2023-04-08 09:45| 来源: 网络整理| 查看: 265

新语法系列 之 interface 功能详解 2014-04-22 15:51:51   来源:Fcode研讨团队   评论:0 点击: 本文详细介绍了interface用作接口界面块、函数重载和操作符重载时的用法。 接口界面块:Interface 功能详解 说明:子程序可看做无返回值的函数,为了方便叙述,如未特别说明,文中将函数(function)和子程序(subroutine)统称为函数。 函数的接口信息用于告诉编译器应该如何正确调用该函数,它包括参数和返回值的数量、类型等信息。因此每个函数都必须具有相应的接口信息,缺省情况具有隐式声明,而使用interface则可显式声明函数的接口信息。 Interface 的主要功能: 1、明确外部函数(external procedure) 或虚函数(dummy procedure)的接口信息,包括:输入输出参数的类型和属性、返回值类型、函数属性; 2、定义通用过程名,即函数重载(overload); 3、操作符(+,-,*,/,et al)和赋值符(=)重载。   下面将分别对以上三种功能进行说明。   1、接口界面块     内部函数(contains)、模块(module)中的函数,以及Fortran标准函数 (如:sind、abs等) 均自动包含显式接口,不需要也不能再次声明接口信息,因此上述情况不在讨论之中。我们建议将外部函数封装在module中使用。     外部函数缺省具有隐式接口,对一些常规函数,用户不必显示声明其接口信息,编译器也能正确识别。但当外部函数的形参具有ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE, VOLATILE属性时,必须显示声明接口信息。下列情况之一也必须使用接口界面块: ● 外部函数返回值为指针、数组或可变长度字符串; ● 形参为数组片段; ● 参数个数不确定或包含可选参数; ● 改变参数传递顺序; ● 子程序中扩展了赋值号的使用范围。       接口界面块的使用较为简单,在接口界面块(interface-end interface)之间写入函数形参类型说明语句,即去掉所有可执行语句后的剩余部分。下面的例子给出了函数返回数组时以及具有可选参数时使用interface的例子: program Fcode_cn integer::i=0, j=1, k=2, m(2) interface ! 接口块 subroutine sub1(i,j,k) integer,optional::k integer i,j end subroutine function func1(j,k) integer j, k integer func1(2) end function end interface m = func1(j,k) print*, m ! m=3,-1 call sub1(i,j,k) print*, i ! i=3 call sub1(i,j) print*, i ! i=1 pause end function func1(j,k) integer j, k integer func1(2) func1(1) = j + k func1(2) = j - k end function subroutine sub1(i,j,k) integer,optional::k integer i,j if( present(k) ) then i = j + k else i = j end if end subroutine 2、函数重载 某些情况下,我们需要对不同类型或不同数量的参数做相似或相同的操作,由于参数类型、数量不同,我们需要编写不同的函数来处理。比如求绝对值,如果参数是4字节整数,我们需要调用iabs函数;如果参数是4字节或8字节实数,我们需要分别调用abs或dabs函数。 由于需要记住多个功能相同或相近的函数,增加了我们使用这些函数的难度,同时也增加了出错的可能性,比如将实数传递给iabs函数。 上述函数的功能相同,只是参数类型或个数不同,那么可否使用同一个函数名来执行它们呢?当然可以,这就是函数重载。函数重载允许通过调用通用过程名来执行特定函数。当用户调用通用过程名时,编译器首先检查传入参数的类型和数量,再调用与之匹配(类型和数量相同)的特定函数来执行具体任务。 例如我们建立通用过程名abs来求绝对值,用户在任何情况都只需调用abs,编译器会自动选用合适的特定函数执行对应操作:当传入参数是4字节整数,就调用iabs函数;如果是8字节实数,则调用dabs函数。 下面用求绝对值的例子说明函数重载功能。为与Fortran内在函数abs区别开来,我们在函数名后添加“_f”。 module abs_module implicit none interface abs_f module procedure abs_f, dabs_f, iabs_f end interface contains function abs_f(x) real(4) abs_f, x if( x


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3