Fortran 中的矩阵生成

Matrix generation in Fortran

问题:我需要生成一个 M*N 矩阵,其中 M 代表行,N 代表列。 该矩阵的元素应类似于 (i-1.0)*N+j。 此代码不起作用,我不明白为什么。 我使用 Compaq Visual Fortran 6.

我除了这段代码必须生成一个矩阵。生成后矩阵应该打印成

1.0 2.0 3.0

4.0 5.0 6.0

对于3*2矩阵。

现在这段代码根本不起作用,向我展示了一堆 Windows 执行错误。

INTEGER M, N, I, J
COMMON /BLK1/ MATA (256, 256)
READ (7, 100) M
READ (7, 100) N
100 FORMAT (I3)
CALL MATGEN (M, N)
DO 90003 I = 1, M
DO 90004 J = 1, N
WRITE (8, 101) MATA(I, J)
101 FORMAT (F8.1, ' ', \)
90004 CONTINUE
WRITE (8, 102)
102 FORMAT (/, /)
90003 CONTINUE
END



SUBROUTINE MATGEN (M, N)
REAL DUM
INTEGER I, J
COMMON /BLK1/ MATA (256, 256)
DUM = 1.0
DO 90001 I = 1, M
DO 90002 J = 1, N
MATA (I, J) = DUM + 1.0
90002 CONTINUE
90001 CONTINUE
RETURN
END

COMMON BLK1
REAL MATA (256, 256)
END

您的代码有几个问题:

  • 程序没有真正启动(在下面的代码中是PROGRAM TEST
  • MATA 是(隐含地)整数。我添加了声明。以后请用IMPLICIT NONE
  • 末尾有一些不属于那里的奇怪代码...
  • 正如 francescalus 指出的那样,赋值没有递增,因此 MATA2 填充。
  • 我的 gfortran 版本不接受反斜杠来禁止换行。我不得不使用 $。有关详细信息,请参阅 here
  • Agentp 表示您没有打开第七单元进行输入。我将该行改为从 STDIN 读取。
  • 缩进不疼!
      PROGRAM TEST
      IMPLICIT NONE
      INTEGER M, N, I, J
      REAL MATA
      COMMON /BLK1/ MATA(256, 256)
      WRITE(*,*) 'Please enter M:'
      READ (*, 100) M
      WRITE(*,*) 'Please enter N:'
      READ (*, 100) N
100   FORMAT (I3)

      CALL MATGEN (M, N)
      DO 90003 I = 1, M
        DO 90004 J = 1, N
          WRITE (8, 101) MATA(I, J)

101   FORMAT (F8.1, ' ', $)
90004   CONTINUE
        WRITE (8, 102)
102   FORMAT (/, /)
90003 CONTINUE
      END

      SUBROUTINE MATGEN (M, N)
      IMPLICIT NONE
      INTEGER M, N
      REAL DUM
      INTEGER I, J
      REAL MATA
      COMMON /BLK1/ MATA(256, 256)
      DUM = 0.0
      DO 90001 I = 1, M
        DO 90002 J = 1, N
          DUM = DUM + 1.
          MATA (I, J) = DUM
90002   CONTINUE
90001 CONTINUE
      RETURN
      END

这导致:

$ ./a.out 
 Please enter M:
2
 Please enter N:
3

$ cat fort.8 
     1.0      2.0      3.0 


     4.0      5.0      6.0