使用来自模块的数组在Fortran中的另一个子例程或主程序中使用

时间:2013-05-21 13:38:29

标签: arrays module fortran

如果有人可以帮助我,我会很高兴的。我正在学习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 elemets都等于10.0。我的程序中出现的错误是什么?更重要的是,我对模块的用途是否正确?我现在正在处理的一个大问题上有类似的问题。谢谢。

1 个答案:

答案 0 :(得分: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