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)。

有两个简单的解决方案:

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 回答