You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.值,导致程序读取到未初始化的垃圾内存,从而输出随机结果。

解决方法

可以通过以下方式规避该问题:

  1. 显式指定分配类型并手动赋值:修改allocate语句,明确指定类型后再初始化,确保内存被正确赋值:
    allocate(logical :: bool)
    bool = .false.
    
  2. 使用mold参数指定类型:若需保留多态分配的灵活性,可先用mold确定类型,再手动赋值:
    allocate(bool, mold=.false.)
    bool = .false.
    
  3. 升级编译器版本:Intel Fortran后续版本(如2023.1及之后)已修复该类初始化问题,升级后原代码可正常运行。

内容的提问来源于stack exchange,提问作者TrippLamb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:12:35