Fortran中在SELECT TYPE中的相同代码块

3

我想知道是否有一种优雅的方法来避免在 SELECT TYPE 构造中重复适用于不同类型的代码块。例如:

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

将codeA放入子程序中。 - cup
1
您可能会在这里找到其他与Fortran中的“模板”概念相关的问题。其中一个建议是使用include - francescalus
3个回答

3
与“选择案例”结构不同,您可以在同一案例语句中组合多个测试,在“选择类型”结构中没有此类设施。
原因是:在每个类型守卫语句的块内,选择器(您要匹配的变量或表达式)将具有与在类型守卫语句中命名的类型相同的类型,并且不会在那里具有多态性。这就是您如何在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衍生语言中的switch语句不同,Fortran中的select结构不会“fall through”,即在Fortran中匹配后,相应的块将被执行并且控制退出结构。
正如@cup所说,您可以将各个分支上共同的内容转换为子例程,以避免重复。但请注意,如果您需要将var传递给该例程,则必须将其声明为多态虚拟参数。

Rodrigo: 你的解释非常清晰。谢谢!(确实,这正是我所想要的“选择情况”)。 Cup:是的,使用子程序可能是最简单的解决方案,这也是我最后采取的措施。 Francescalus:我没有想到那个解决方案。我会尝试一下,尽管我通常不经常使用“包含”语句(通常,我发现生成的代码不太容易阅读)。谢谢大家的帮助。 - R. Hassani

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

0

有一种重载运算符类型的构造,它建议使用“类型为”。这需要作为子例程或函数在模块中。我大多数情况下使用函数,所以如果与C混合使用,则子例程可能比尝试返回向量的函数更容易。

它仍将是完全相同的代码,只是操作复杂、浮点、双精度或各种整数但深度不同...因此没有明确的“类型”,因为右侧版本是基于参数类型选择的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接