0

在我的 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),我指定的是列向量而不是行向量?非常感谢您的宝贵时间。

4

1 回答 1

4

您正在指定一个名为 time 的 rank-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
于 2011-08-03T17:42:30.937 回答