Fortran声明时赋值的变量用作数组维度出现报错该如何解决
Fortran用动态值声明数组维度的解决方案
错误根因
你收到报错的核心原因是:parameter修饰符要求变量值必须在编译阶段就能完全确定,而你代码中val_4、val_5的取值依赖传入参数str_A的成员,str_A是运行时才会拿到具体值的入参,不符合parameter的要求。
至于array_1能正常声明,是因为Fortran 90及之后标准支持自动数组,允许用运行时确定的整数值直接定义数组维度,不需要维度值是编译期常量。
解决方案
有两种常用的实现方式可以满足你复用长表达式、提升可读性的需求:
方案1:使用普通整数变量+自动数组
直接去掉val_4、val_5的parameter修饰符,声明为普通整数变量后赋值,再用于定义自动数组即可。该写法符合Fortran 2003及之后的标准,代码最简洁:
type (typ_A), intent (in) :: str_A integer :: val_4, val_5 val_4 = str_A%val_1 + str_A%val_2 val_5 = str_A%val_3 integer :: array_1(str_A%val_1, str_A%val_2), array_2(val_4, val_5)
如果你的编译器版本过旧不支持上述写法,改用下面的可分配数组方案。
方案2:使用可分配数组
可分配数组兼容性更强,也更灵活,适合复杂场景使用:
type (typ_A), intent (in) :: str_A integer :: val_4, val_5 ! 先声明数组为可分配类型,不指定维度 integer, allocatable :: array_1(:,:), array_2(:,:) ! 计算复用的维度值 val_4 = str_A%val_1 + str_A%val_2 val_5 = str_A%val_3 ! 按实际维度分配数组空间 allocate(array_1(str_A%val_1, str_A%val_2), array_2(val_4, val_5)) ! 代码逻辑执行完成后可显式释放空间,现代Fortran也支持作用域结束后自动释放 ! deallocate(array_1, array_2)
内容的提问来源于stack exchange,提问作者The_Learner
相关产品推荐
相关产品推荐

