我尝试在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
我也试过把这个枚举包含在一个类型和许多其他东西中,但都不起作用。
这里我可以比较Colors
和Size
。例如,在C语言中,当我声明color
和size
类型定义枚举时,我没有这样的问题,因为这两种类型是不同的。
是否存在一个简单的解决方案,有几个枚举类型在Fortran?
否则,我设想用一个保存值的整数成员声明几个类型,然后创建接口来重载我需要的操作符(比较、修饰等)。我不确定那个解决方案是否可行,但我能做到。
Fortran没有您希望使用的那种枚举类型1
Fortran中的枚举是枚举数的集合。问题的程序有两个。
枚举数本身是可与C相应枚举类型互操作的命名(整型)常量。它们的存在是为了C的互操作性,而不是为了在Fortran中提供类似的功能。
问题中的枚举数Green
和Large
是两个值为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中给出。