DATA Statement问题:变量不够

时间:2013-09-20 15:45:07

标签: fortran

我很难弄清楚为什么我的代码会给我这个错误

error 281 - Not enough variables in DATA statement

我在Windows 8上使用最新的Silverfrost。模块的相关部分是,

...
INTEGER, parameter :: maxExampleTypes     =   5
TYPE ExampleInfo
    CHARACTER (len=50) :: ExDeckName
    INTEGER A(maxExampleTypes)
    INTEGER ExUnits
ENDTYPE ExampleInfo
TYPE(ExampleInfo) :: Example(10)
DATA Example(1)%ExDeckName/'test.dck'/
DATA Example(1)%A/1,2,3,4,5/
...

奇怪的是,当我只用

A指定一个变量时
DATA Example(1)%A/1/

错误消失。

你知道它可能来自哪里吗?

1 个答案:

答案 0 :(得分:2)

我永远不会在现代Fortran中使用DATA语句。尝试

...
INTEGER, parameter :: maxExampleTypes     =   5
TYPE ExampleInfo
    CHARACTER (len=50) :: ExDeckName
    INTEGER            :: A(maxExampleTypes)
    INTEGER            :: ExUnits
ENDTYPE ExampleInfo
TYPE(ExampleInfo) :: Example(10)

Example(1)%ExDeckName = 'test.dck'
Example(1)%A          = (/ 1,2,3,4,5 /)
...

如果值应该是默认值,请将它们放入类型声明中:

...
INTEGER, parameter :: maxExampleTypes     =   5
TYPE ExampleInfo
    CHARACTER (len=50) :: ExDeckName = 'test.dck'
    INTEGER            :: A(maxExampleTypes) = (/ 1,2,3,4,5 /)
    INTEGER            :: ExUnits
ENDTYPE ExampleInfo
TYPE(ExampleInfo) :: Example(10)
...

示例测试程序:

module testmod
  implicit none
  INTEGER, parameter :: maxExampleTypes     =   5
  ! Type with default values
  TYPE ExampleInfo
      CHARACTER (len=50) :: ExDeckName = 'test.dck'
      INTEGER            :: A(maxExampleTypes)= (/ 1,2,3,4,5 /)
      INTEGER            :: ExUnits
  ENDTYPE ExampleInfo

contains
  subroutine init_ExampleInfo(array)
    implicit none
    type(ExampleInfo), intent(out):: array(:)
    integer                       :: i

    do i=1,size(array)
      array(i)%ExDeckName = 'test.dck'
      array(i)%A          = (/ 1,2,3,4,5 /)
    enddo
  end subroutine
end module

program test
  use testmod
  implicit none
  TYPE(ExampleInfo) :: Example(10)

  ! Initialize manually
  ! call init_ExampleInfo(Example)
  write(*,*) Example(1)%ExDeckName, Example(1)%A

  ! Set new values
  Example(1)%ExDeckName = 'test2.dck'
  Example(1)%A          = (/ 5,4,3,2,1 /)

  write(*,*) Example(1)%ExDeckName, Example(1)%A
end program