web-dev-qa-db-ja.com

Fortranでパラメーター化された派生型のパラメトリックサイズの配列を初期化しますか?

Fortranでは、派生型の要素のサイズをパラメーター化できます。ただし、固定サイズの要素が型宣言で割り当てられたデフォルト値を持つことができる場合、パラメータ化されたエントリの方法はないようです:

PROGRAM main
  IMPLICIT NONE

  TYPE data1
     INTEGER :: array(5) = 2   ! allowed
  END type data1

  TYPE data2(n)
     INTEGER, LEN :: n
     INTEGER :: array(n) = 2   ! incorrect: error #8737 with intel fortran 19,
  END type data2               !            ignored by gfortran 8.2.1

END PROGRAM main

デフォルト値を割り当てると、タイプが使用されるたびに初期化を繰り返す必要がなくなるので便利ですが、パラメトリックサイズのフィールドでは許可されません。 Gfortranはデフォルト値を黙って無視するだけで、インテルFortranはエラーを発行します

error #8737: For a default initialized component every type parameter and array bound
             must be a constant expression.   [ARRAY]

結局のところ、デフォルト値を定義できる構文はありますか?

5
kdb

さまざまなコンパイラにバグが見つかりました。コードは標準に準拠しています。コードを少し具体化すると、以下は「2 2 2」を出力するはずです。

program main

implicit none
!
! F2018, 7.5.1, page 64: A derived type can be parameterized by one or
! more type parameters, each of which is defined to be either a kind
! or length type parameter and can have a default value.
!
! F2018, 7.5.3.1, page 69: A type parameter may be used as a primary in
! a specification expression (10.1.11) in the derived-type-def.
!
! 10.1.11 Specification expression (page 156)
! ...
!    R1028 specification-expr  is scalar-int-expr
!
! C1010 (R1028) The scalar-int-expr shall be a restricted expression.
!
! A restricted expression is an expression in which each operation is
! intrinsic or defined by a specification function and each primary is
! ...
! (13) a type parameter of the derived type being defined,
!
type data2(n)
   integer, len :: n
   integer :: array(n) = 2
end type data2

type(data2(n=3)) :: a

print *, a%array  ! This should print 2 2 2

end program main

gfortranはコードをコンパイルしますが、「0 0 0」を出力するため、gfortranにはコンポーネントの初期化の適用にバグがあります。

0
evets