Fortran中SELECT TYPE中的相同代码块

时间:2018-05-26 22:17:00

标签: fortran

我想知道是否有一种优雅的方法可以避免重复应用于SELECT TYPE construct中不同类型的代码块。考虑例如:

select type (var)
   type is (t1_t)
     codeA (many lines of code)
   type is (t2_t)
     codeA (same lines)
   ...
   type is (tn_t)
     codeB
   class default
     codeC
end select

3 个答案:

答案 0 :(得分:2)

select case构造不同,您可以在同一案例声明中对多个测试进行分组,select type构造中没有这样的工具。

原因是:在每个type-guard语句的块中,选择器(你匹配的变量或表达式)将具有与type-guard语句中命名的相同类型,并且在那里不会是多态的。这就是Fortran中动态类型解析的方式,即静态类型。

select type (var)
  type is (t1_t)
    ! Here, type of var is t1_t, and you can call
    ! procedures that use type(t1_t) as arguments with var
  type is (t2_t)
    ! Here, type of var is t2_t, and procedures expecting
    ! type(t1_t) as arguments won't work with var
  ...
end select

因此,编译器不允许您在同一个类型保护中对许多类型进行分组,因为它不知道要在选择器上应用哪种动态类型。

作为旁注,与c-derived语言中的switch语句不同,Fortran中的select构造不会通过,即在Fortran中匹配后,执行相应的块并且控件退出构造。

正如@cup所说,你可以转换你在子程序中各个分支上的共同点,以避免重复。但请注意,如果您需要将var传递给例程,则必须将其声明为多态虚拟。

答案 1 :(得分:0)

正如francescalus在评论中指出的,重复相同代码行的典型方法是使用包含文件。这是一种传统技术,曾经广泛用于普通街区,也用于穷人的模板。

included.f90:

codeA (many lines of code)

main.f90时:

select type (var)
   type is (t1_t)
     include "included.f90"
   type is (t2_t)
     include "included.f90"
   ...

end select

如果使用C预处理器,也可以使用预处理器的#include

答案 2 :(得分:0)

“类型为”建议的构造的重载运算符类型。这需要作为子程序或函数在模块中。我主要使用函数,所以如果一个函数与C混合,那么子例程可能比试图返回向量的函数更容易。

它仍然是完全相同的代码,只是对复数,浮点数,双精度或各种整数但深度进行操作...所以没有明确的'类型',因为根据争论选择了正确的版本类型。