如何在Fortran中做几个枚举类型?



我尝试在Fortran中声明几种枚举类型。

这个有趣的简单例子很好地说明了我的问题:

program Main

enum, bind(c)
enumerator :: Colors = 0
enumerator :: Blue = 1
enumerator :: Red = 2
enumerator :: Green = 3
end enum
enum, bind(c)
enumerator :: Size = 0
enumerator :: Small = 1
enumerator :: Medium = 2
enumerator :: Large = 3
end enum

integer(kind(Colors)) :: myColor
myColor = Green
if (myColor == Large) then
write(*,*) 'MyColor is Large'
end if
end program Main

我也试过把这个枚举包含在一个类型和许多其他东西中,但都不起作用。

这里我可以比较ColorsSize。例如,在C语言中,当我声明colorsize类型定义枚举时,我没有这样的问题,因为这两种类型是不同的。

是否存在一个简单的解决方案,有几个枚举类型在Fortran?

否则,我设想用一个保存值的整数成员声明几个类型,然后创建接口来重载我需要的操作符(比较、修饰等)。我不确定那个解决方案是否可行,但我能做到。

Fortran没有您希望使用的那种枚举类型1

Fortran中的枚举是枚举数的集合。问题的程序有两个。

枚举数本身是可与C相应枚举类型互操作的命名(整型)常量。它们的存在是为了C的互操作性,而不是为了在Fortran中提供类似的功能。

问题中的枚举数GreenLarge是两个值为3的命名整型常量(可能是不同类型的)。Green==Large是一个真表达式,无论常量的类型参数是什么。

在Fortran中没有机制将变量限制为枚举的值。这些常量可以等价地声明为

integer(kind=enum_kind1) :: Green = 3_enum_kind1
integer(kind=enum_kind2) :: Large = 3_enum_kind2

对应的适当的类型值(在本例中很可能是相同的:C_INT)和Fortran程序不会知道有什么区别。

如果您希望使用C和类似语言中存在的枚举类型,则必须使用非内在方法(如问题所示)。


1这是当前2018年语言版本的情况。此时,有一个关于下一个修订(暂定为2023年)的建议,以包含更接近这里所需的枚举类型。本规范在一个特定工作草案的7.6.2中给出。

最新更新