常见的Fortran派生类型:初始化?
我遇到了这个普通问题:常见的Fortran派生类型:初始化?,fortran,fortran90,static-initialization,Fortran,Fortran90,Static Initialization,我遇到了这个普通问题: COMMON /REDCOM/ DPREC,NITMA,INDIC,NBERR,NCAR,KMOTLU, & REDVAR,MOCDER(2) COMMON /REDCO1/ CTEXT C type(double_st) :: DPREC INTEGER :: NITMA,INDIC,NBERR,NCAR,KMOTLU,REDVAR,MOCDER CHARACTE
COMMON /REDCOM/ DPREC,NITMA,INDIC,NBERR,NCAR,KMOTLU,
& REDVAR,MOCDER(2)
COMMON /REDCO1/ CTEXT
C
type(double_st) :: DPREC
INTEGER :: NITMA,INDIC,NBERR,NCAR,KMOTLU,REDVAR,MOCDER
CHARACTER(72) :: CTEXT
CHARACTER(4) :: CTEXT4
C
EQUIVALENCE (CTEXT,CTEXT4)
double\u st
派生类型为:
type double_st
sequence
real(kind(0.d0)) :: x,y,z
integer :: acc = -1
end type double_st
尝试编译一些代码,包括以下常见代码,我得到:
ifort:
./REDCOM.INC(1): error #6005: A derived type object in a COMMON block shall not have default initialization [DPREC]
COMMON /REDCOM/ DPREC,NITMA,INDIC,NBERR,NCAR,KMOTLU,
----------------------^
格弗特兰:
REDCOM.INC:1.27:
Included at m_abaq4.f:90:
COMMON /REDCOM/ DPREC,NITMA,INDIC,NBERR,NCAR,KMOTLU,
1
Error: Derived type variable 'dprec' in COMMON at (1) may not have default initializer
由于不太熟悉Fortran,我不知道问题是什么,也不知道如何解决(我尝试过谷歌搜索,但没有成功)。如果我使用REAL(8)
而不是double\u st
,那么一切都很好
有人能帮我吗?电话那头的
integer :: acc = -1
剥去拖尾
= -1
离开
integer :: acc
重新编译,看看会发生什么。错误消息表明,程序不能初始化派生类型组件,不能在common
语句中使用该派生类型的变量在Fortran标准中,Initialize“用于精确地表示变量(或元素)在其声明中的值的设置
在我的Fortran 2008标准(草案)版本中,规则503上的约束506禁止初始化公共块中使用的派生类型变量的组件。这种禁止似乎不适用于内部类型变量的初始化,因此当变量类型为real(8)
时,编译器接受代码
至于在公共块中使用派生类型,如果曾经有过这样的事情,那就是混合范式编程 从线路开始
integer :: acc = -1
剥去拖尾
= -1
离开
integer :: acc
重新编译,看看会发生什么。错误消息表明,程序不能初始化派生类型组件,不能在common
语句中使用该派生类型的变量在Fortran标准中,Initialize“用于精确地表示变量(或元素)在其声明中的值的设置
在我的Fortran 2008标准(草案)版本中,规则503上的约束506禁止初始化公共块中使用的派生类型变量的组件。这种禁止似乎不适用于内部类型变量的初始化,因此当变量类型为real(8)
时,编译器接受代码
至于在公共块中使用派生类型,如果曾经有过这样的事情,那就是混合范式编程 我说的与中的基本相同,但希望有更多的阐述。在那个答案被编辑之后,我实际上有点偏离了 具有类型声明的
type double_st
sequence
real(kind(0.d0)) :: x,y,z
integer :: acc = -1
end type double_st
涉及默认初始化。这就是acc=1
部分:参见Fortran 2008 4.5.4.6。默认初始化的不仅仅是组件,而是整个类型
有一个约束条件(5.7.2.1中的C5105)表明
如果公共块对象是派生类型,则该类型应具有BIND属性或SEQUENCE属性,且不应具有默认初始化
这就是编译器所抱怨的。使用
real(种类(0d0))
(或real(8)
)不会违反此约束。内部类型(如real
)不能具有默认初始化,但可以具有显式初始化(如real::hello=1.
)。对于显式初始化对象的使用有一些限制(如另一个答案中提到的C506),但在这一点上,问题还不够清楚,我无法进一步评论。我的说法与中的基本相同,但希望能更详细一些。在那个答案被编辑之后,我实际上有点偏离了
具有类型声明的
type double_st
sequence
real(kind(0.d0)) :: x,y,z
integer :: acc = -1
end type double_st
涉及默认初始化。这就是acc=1
部分:参见Fortran 2008 4.5.4.6。默认初始化的不仅仅是组件,而是整个类型
有一个约束条件(5.7.2.1中的C5105)表明
如果公共块对象是派生类型,则该类型应具有BIND属性或SEQUENCE属性,且不应具有默认初始化
这就是编译器所抱怨的。使用
real(种类(0d0))
(或real(8)
)不会违反此约束。内部类型(如real
)不能具有默认初始化,但可以具有显式初始化(如real::hello=1.
)。对于显式初始化对象的使用有一些限制(如另一个答案中提到的C506),但在这一点上,问题还不够清楚,我无法进一步评论。@janou195它到底打印了什么?代码到底是什么样子的?错误消息仍然与我的问题中的相同。你指的是哪段代码?@janou195如果你删除了默认初始化,那么默认初始化的错误消息让我们(至少是我)感到困惑。现在,因为它是一种序列类型,所以这种类型可能还有其他定义。你能检查一下吗?好的,我弄错了。。。它同样适用于gfortran,抱歉,谢谢你的支持helping@janou195它到底打印什么?代码到底是什么样子的?错误消息仍然与我的问题中的相同。你指的是哪段代码?@janou195如果你删除了默认初始化,那么默认初始化的错误消息让我们(至少是我)感到困惑。现在,因为它是一种序列类型,所以这种类型可能还有其他定义。你能检查一下吗?好的,我弄错了。。。它同样适用于gfortran,抱歉,谢谢你的帮助