Fortran 90在尝试从数组中提取向量时排名不匹配

时间:2011-08-03 17:31:25

标签: fortran extract fortran90

在我的Fortran 90代码中,我创建了以下数组(称为数组)的整数:

 1     2     3     4     5     6     7     8     9    10
11    12    13    14    15    16    17    18    19    20
21    22    23    24    25    26    27    28    29    30
31    32    33    34    35    36    37    38    39    40

我希望提取第一列,并将其保存在名为 time 的四元素向量中。我有以下代码:

PROGRAM test
  IMPLICIT NONE
  INTEGER, PARAMETER :: numrows=4, numcols=10
  INTEGER :: i, j, k
  INTEGER, DIMENSION(:,:), ALLOCATABLE :: array, time

  ALLOCATE(array(numrows,numcols))
  ALLOCATE(time(numrows))

  k=1
  DO i=1,numrows
    DO j=1,numcols
      array(i,j)=k
      k=k+1
    END DO
  END DO

  DO i=1,numrows
    WRITE(*,"(100(3X,I3))") (array(i,j), j=1,numcols)
  END DO

  time=array(:,1)
END PROGRAM test

但是,我收到以下错误消息(在gfortran中编译时):

test.f90:8.15:

  ALLOCATE(time(numrows))
               1
Error: Rank mismatch in array reference at (1) (1/2)
test.f90:22.2:

  time=array(:,1)
  1
Error: Incompatible ranks 2 and 1 in assignment at (1)

为什么会这样?错误消息似乎表明数组array(:,1)的等级为2,而不是等级1.是否有任何方法可以将array(:,1)转换为等级1的数组?我是否需要使用RESHAPE以某种方式挤压阵列?或者是使用array(:,1)的问题,我是指定列向量而不是行向量?非常感谢你的时间。

1 个答案:

答案 0 :(得分:4)

您正在指定名为time的排名2可分配数组:

INTEGER, DIMENSION(:,:), ALLOCATABLE :: array, time

然后尝试将其分配为rank-1数组:

  ALLOCATE(time(numrows))

- 不要那样做。这完全没问题:

PROGRAM test
  IMPLICIT NONE
  INTEGER, PARAMETER :: numrows=4, numcols=10
  INTEGER :: i, j, k
  INTEGER, DIMENSION(:,:), ALLOCATABLE :: array
  INTEGER, DIMENSION(:), ALLOCATABLE :: time

  ALLOCATE(array(numrows,numcols))
  ALLOCATE(time(numrows))

  k=1
  DO i=1,numrows
    DO j=1,numcols
      array(i,j)=k
      k=k+1
    END DO
  END DO

  DO i=1,numrows
    WRITE(*,"(100(3X,I3))") (array(i,j), j=1,numcols)
  END DO

  time=array(:,1)
END PROGRAM test