2015-04-05 197 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