Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
常见的Fortran派生类型:初始化?_Fortran_Fortran90_Static Initialization - Fatal编程技术网

常见的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,抱歉,谢谢你的帮助