0

私のFortran90コードでは、整数の次の配列( arrayと呼ばれる)を作成しました。

 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という4要素のベクトルに保存したいと思います。私は次のコードを持っています:

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)

なぜそうなのですか?エラーメッセージは、配列がランク1ではなくランク2であることを示唆しているようです。ランク1の配列にarray(:,1)変換する方法はありますarray(:,1)か?RESHAPEどういうわけかアレイをスクイーズするために使用する必要がありますか?または、を使用してarray(:,1)、行ベクトルではなく列ベクトルを指定しているという問題はありますか?お時間をいただき、誠にありがとうございます。

4

1 に答える 1

4

timeと呼ばれるランク2の割り当て可能な配列を指定しています。

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

次に、それをランク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 に答える