Fortran中使用source分配class(*)逻辑指针是否合法?Intel编译器现随机输出
Fortran代码合法性与随机输出问题解答
代码合法性
这段代码在Fortran标准中是合法的:
- 声明
class(*), pointer类型的多态指针bool符合Fortran多态类型语法规则。 allocate(bool, source=.false.)的写法符合标准:编译器应根据源表达式.false.的logical类型,为指针分配对应类型的对象,并将其初始化为.false.。select type语句正确匹配logical类型,后续打印逻辑的语法和语义均符合标准要求。
随机输出的原因
你遇到的随机打印'T'或'F'的问题,是Intel Fortran OneAPI 2023.0.0版本的编译器bug:
该版本在处理多态指针通过allocate(source=...)初始化逻辑类型对象时,未正确将内存初始化为指定的.false.值,导致程序读取到未初始化的垃圾内存,从而输出随机结果。
解决方法
可以通过以下方式规避该问题:
- 显式指定分配类型并手动赋值:修改allocate语句,明确指定类型后再初始化,确保内存被正确赋值:
allocate(logical :: bool) bool = .false. - 使用
mold参数指定类型:若需保留多态分配的灵活性,可先用mold确定类型,再手动赋值:allocate(bool, mold=.false.) bool = .false. - 升级编译器版本:Intel Fortran后续版本(如2023.1及之后)已修复该类初始化问题,升级后原代码可正常运行。
内容的提问来源于stack exchange,提问作者TrippLamb
相关产品推荐
相关产品推荐

