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