求帮忙看下用Fortran77编写Subroutine中使用Save声明二维数组错误
使用Fortran77编写的子例程代码如下,其余部分做了省略Subroutine urmath(...)
Implicit none
C ...
Common/xxx/,xx1,xx2,xx3...
C ...
Dimension beta(mxele,mxele),alpha(2,mxele)
Dimension gamma(3,nxele)
Dimension Jacobi(mxele)
Real*8 lr,beta,alpha,gamma,Jacobi
C ...
Save beta,alpha
Save gamma,Jacobian
Save lr
C ...
End Subroutine urmath(...)这个mxele与nxele为整数
编译上述子例程会出现下述错误:
Error: An automatic object must not appear in a SAVE statement or be declared with the SAVE attribute.
并且报错是针对数组beta,alpha,gamma这三个二维数组,
而对数组Jacobi和浮点数lr并没有报错
请问这是为什么?
save属性的数组,不能由子程序的参数指定。不然大小可能会改变,就没法保存数据了。 li913 发表于 2022-4-14 09:10
save属性的数组,不能由子程序的参数指定。不然大小可能会改变,就没法保存数据了。 ...
那可以由子程序的输入参数确定吗? li913 发表于 2022-4-14 09:10
save属性的数组,不能由子程序的参数指定。不然大小可能会改变,就没法保存数据了。 ...
还想问一下
上边的程序用Subroutine里的参数声明了Jacobi的大小,这里并没有报错呀,这是为什么 Save属性的参数,会保存起来,函数返回后仍然存活。
而自动数组,它的大小每次函数调用,参数(无论输入参数还是输出参数)不同大小就不同,逻辑上两者就冲突,没法“即存起来,又每次大小不同” 青衣巷 发表于 2022-4-14 16:22
Save属性的参数,会保存起来,函数返回后仍然存活。
而自动数组,它的大小每次函数调用,参数(无论输入参 ...
所以Save语句后的数组在声明时,其在各个维度上的大小必须是常数是吗?
本帖最后由 青衣巷 于 2022-4-14 22:31 编辑
可分配数组也可以save
具有save属性的变量,你可以理解为定义在一个特殊的空间里。
它具有永久的生命周期(指本程序的实例开始执行到进程退出),但只具有当前子程序范围内的作用域
可以思考以下子程序,尝试去掉 save 属性再试试:
program main
implicit none
call sub(3)
call sub(4)
contains
Subroutine sub(j)
integer :: j
integer , allocatable , save :: d(:)
if(.not.allocated(d)) then
allocate(d(j))
d = j
end if
write(*,*) d
End Subroutine sub
end program main
青衣巷 发表于 2022-4-14 22:25
可分配数组也可以save
具有save属性的变量,你可以理解为定义在一个特殊的空间里。
它具有永久的生命周期( ...
好的,谢谢,我琢磨一下,
页:
[1]