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