2015-04-05 225 views
0

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

我除了这个代码必须生成一个矩阵。生成后的基质应印像

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 
+2

如果指定为什么代码不工作这将是有益的。你期待它做什么?它现在做了什么? – mattm 2015-04-05 15:15:45

+0

你不打开单元7 – agentp 2015-04-05 15:35:33

+1

'隐式无'对你来说是件好事。除了这个问题,请注意你的'mata(i,j)'的赋值并不取决于'i'或'j'。 – francescalus 2015-04-05 15:40:39

回答

2

有几个问题与您的代码:

  • 该方案并没有真正启动(在本文下面的代码是PROGRAM TEST
  • MATA(隐含)的整数。我添加了声明。未来请使用IMPLICIT NONE
  • 有在不真正属于那里结束一些奇怪的代码...
  • 作为francescalus指出,分配不增加,所以MATA充满2
  • 我的版本的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 
+0

为记录反斜杠似乎是一个英特尔扩展。注意'$'也是一个扩展,尽管我认为更常见。除非你真的需要使用古董编译器,否则请尝试'advance = no'。 – agentp 2015-04-06 19:49:24

+0

@agentp'advance = no'已被添加到Fortran 95中,并且不可用于FORTRAN 77.不幸的是,禁止换行符在FORTRAN 77标准中没有定义,'$',反斜线和其他一些行尾是由不同的编译器使用。 – 2015-04-06 19:53:05

+0

对,我的观点有时候人们认为仅仅是因为他们正在使用一些旧代码,即使他们的编译器支持他们,他们也必须避免使用现代构造。 – agentp 2015-04-06 20:04:10