能否直接初始化包含ALLOCATABLE成员的Derived type派生类型变量?
问题解答
你当前编写的代码语法错误,无法直接运行,但带ALLOCATABLE成员的派生类型是可以被初始化作为常量参数的,只要符合Fortran标准的语法要求。
你代码的问题点
- 派生类型构造器中不能直接写入
ALLOCATE()执行语句,ALLOCATE是运行时执行的过程语句,不能出现在常量表达式的构造逻辑里 PARAMETER修饰的常量初始化值必须为常量表达式,你写的IntegerType(ALLOCATE(0))不符合常量表达式的语法要求
正确实现方式
Fortran 2003及更高版本标准支持派生类型构造器对可分配成员的自动分配:当你给可分配成员直接传入常量值时,编译器会自动完成成员的分配、赋值操作,符合常量表达式的要求。如果需要将该派生类型变量声明为PARAMETER常量,还需要编译器支持Fortran 2008及以上标准。
正确的示例代码如下:
PROGRAM testProgram TYPE IntegerType INTEGER, ALLOCATABLE :: Num END TYPE IntegerType ! 直接给可分配成员Num传入常量值0即可,编译器会自动完成分配 TYPE(IntegerType), PARAMETER :: Zero = IntegerType(Num = 0) print*, Zero%Num END PROGRAM testProgram
补充说明
目前主流的gfortran、Intel Fortran、NVHPC Fortran等均已支持上述特性,如果你使用的编译器版本过旧不支持该特性,可以先在代码执行段完成分配和赋值后再使用,不过就不能声明为PARAMETER常量了。
内容的提问来源于stack exchange,提问作者Akhil Akkapelli
相关产品推荐
相关产品推荐

