0

誰かがこれで私を助けてくれたらうれしいです。Fortran でモジュールを勉強しているのですが、質問があります。私のモジュールが、ユーザーの入力から読み取られる行列 [A(3,3)] を作成するとします。次に、そのような行列を新しいサブルーチンで使用して、それを使用して演算を実行できるようにしたいと思います (簡単にするために、合計としましょう)。私のコードは次のようになります。

     module matrixm                                                                                                                                                                                               
          contains                                                              
      subroutine matrixc                                                        
      integer i,j                                                               
      real, DIMENSION(3,3) :: a                                                 
      do 10 i=1,3                                                               
         do 20 j=1,3                                                            
        read(*,*) a(i,j)                                                        
20    continue                                                                  
10    continue                                                                                                          
      end subroutine matrixc                                                    
      end module matrixm                                                        

      program matrix                                                            
          use matrixm                                                           
      real, dimension(3,3) :: b,c                                               
      integer i,j                                                               
          call matrixc                                                          
          b=10.0                                                                
          c=a+b
      write statements here...                                                                 

      end  

A の入力が 1 2 3 4 5 6 7 8 9 の場合、C[3,3] は 11 12 13 14 15 16 17 18 19 であると予想されます。ただし、結果は要素がすべてである行列 C のみを示します。それらの 10.0 に等しい。プログラムで発生したエラーは何ですか? さらに重要なのは、モジュールの使用について正しいかどうかです。私は現在取り組んでいる大きな問題について同様の問題を抱えています。ありがとう。

4

1 に答える 1

1

あなたのプログラムにある問題は、目に見えるメモリです:

aサブルーチンにローカルなマトリックスのデータを読み取りますmatrixc。これは、この変更がプログラムに表示されないことを意味します。

次にa、プログラム内の変数が暗黙的に実数として定義されているため、エラーがスローされません (キーワード: IMPLICIT NONE)。

2 つの簡単な解決策があります。

1:aモジュールの定義部分に行列の定義を入れます。

module matrixm
  REAL, DIMENSION(3,3) :: a

  CONTAINS                                                         
    subroutine matrixc                                                        
      integer i,j                                                               

      do i=1,3                                                               
        do j=1,3                                                            
          read(*,*) a(i,j)        
        end do                                                
      end do                                                                 
    end subroutine matrixc                                                    
end module matrixm

2:サブルーチンのパラメータとして使用aし、メイン プログラムで定義します。

module matrixm
  CONTAINS                                                         
    subroutine matrixc(a)                                          
      integer i,j
      REAL, DIMENSION(3,3) :: a

      do i=1,3                                                               
        do j=1,3                                                            
          read(*,*) a(i,j)        
        end do                                                
      end do                                                                 
    end subroutine matrixc                                                    
end module matrixm

program matrix                                                        
  use matrixm 
  IMPLICIT NONE                                                          
  real, dimension(3,3) :: a,b,c                                              
  integer i,j

  call matrixc(a)                                                          
  b=10.0                                                                
  c=a+b

  write statements here...                                                                 

end program 
于 2013-05-21T13:59:51.390 に答える