Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Fortran中,使用来自模块的数组用于另一个子程序或主程序_Arrays_Module_Fortran - Fatal编程技术网

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

Arrays 在Fortran中,使用来自模块的数组用于另一个子程序或主程序,arrays,module,fortran,Arrays,Module,Fortran,如果有人能帮我,我会很高兴的。我正在学习fortran语言的模块,我有个问题。假设我的模块创建了一个矩阵[a(3,3)],它是从用户的输入中读取的。然后,我想在一个新的子例程中使用这样一个矩阵,这样我就可以用它做一个运算(为了简单起见,让我们说一个求和)。我的代码如下所示: module matrixm

如果有人能帮我,我会很高兴的。我正在学习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的输入是:123456789,人们会期望C[3,3]是1121315171819。然而,结果显示只有一个矩阵C,其元素都等于10.0。我的程序中有什么错误?更重要的是,我对模块的用途是否正确?。在我正在处理的一个大问题上,我也有类似的问题。谢谢

程序中存在的问题是可见内存:

读取矩阵
a
中的数据,该矩阵是子程序
matrixc
的本地数据。这意味着,此更改对程序不可见

接下来,程序中的变量
a
隐式定义为real,因此不会抛出错误(关键字: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