Fortran的Select Type能够识别和区分类型吗?

3

Select Type 能区分 Integer(Int8), Integer(Int16), Integer(Int32), 和 Integer(Int64) 吗?

此外,Select Type 能否识别不考虑所使用的位数的整数类型?

2个回答

2

是的,你可以写出类似以下的代码。这里我使用了内置模块iso_fortran_env中的真实kind常量。

SELECT TYPE(areal)
TYPE is (REAL(real32))
   WRITE(*,*) '... real32'
TYPE is (REAL(real64))
   WRITE(*,*) '... real64'
CLASS default
   WRITE(*,*) '... default'
END SELECT

请注意,您无法编写以下内容。
SELECT TYPE(areal)
TYPE is (REAL(real32))
   WRITE(*,*) '... real32'
TYPE is (REAL(real64))
   WRITE(*,*) '... real64'
TYPE is (REAL)
    WRITE(*,*) '... real'
CLASS default
   WRITE(*,*) '... default'
END SELECT

在这种情况下,一个真正的默认类型(对于大多数当前编译器来说可能是real32)将匹配两个类型保护语句,这是编译器应该捕获的错误。

当然它接受整数类型,这就是为什么你在那里放置了 Integer 的原因。 - Vladimir F Героям слава
同时,Type Is (Real (Real32)) 接受 Real,而 Type Is (Real (Real64)) 接受 Double Precision - Zeus
@Zeus 这很可能是结果,但不具备可移植性。尝试使用 -fdefault-real-8 之类的东西(它并不违反标准!),然后回报结果。 - Vladimir F Героям слава
@Zeus 不要忘记,Fortran2008引入的基于存储大小的类型可能根本不存在。 - Vladimir F Героям слава
使用-fdefault-real-8的后果是RealType Is (Real(Real64))所选中。 - Zeus
显示剩余3条评论

1
不同的整数种类构成不同的内在类型。因此,是的,select type可以区分不同种类的整数。
我不知道有什么可能忽略种类(即不仅仅是字节数,从理论上讲)。您必须为每种类型使用不同的type is部分。

还要注意,可能会有一种32位存储大小的整数类型不是“int32”(等等)。 - francescalus
@francesalus 没错,这就是括号的含义,但直接说可能更好。 - Vladimir F Героям слава
确实,我同意你的观点,并强调如果存在一种基于存储大小进行选择的机制,它不一定会解决所有问题。 - francescalus

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