Fortran Coder

查看: 2861|回复: 7
打印 上一主题 下一主题

[子程序] 求帮忙看下用Fortran77编写Subroutine中使用Save声明二维数组错误

[复制链接]

10

帖子

4

主题

0

精华

入门

F 币
53 元
贡献
28 点
跳转到指定楼层
楼主
发表于 2022-4-13 22:10:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      使用Fortran77编写的子例程代码如下,其余部分做了省略
[Fortran] 纯文本查看 复制代码
      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并没有报错

请问这是为什么?

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

796

帖子

2

主题

0

精华

大宗师

F 币
3787 元
贡献
2266 点
沙发
发表于 2022-4-14 09:10:17 | 只看该作者
save属性的数组,不能由子程序的参数指定。不然大小可能会改变,就没法保存数据了。

10

帖子

4

主题

0

精华

入门

F 币
53 元
贡献
28 点
板凳
 楼主| 发表于 2022-4-14 11:08:03 | 只看该作者
li913 发表于 2022-4-14 09:10
save属性的数组,不能由子程序的参数指定。不然大小可能会改变,就没法保存数据了。 ...

那可以由子程序的输入参数确定吗?

10

帖子

4

主题

0

精华

入门

F 币
53 元
贡献
28 点
地板
 楼主| 发表于 2022-4-14 12:47:51 | 只看该作者
li913 发表于 2022-4-14 09:10
save属性的数组,不能由子程序的参数指定。不然大小可能会改变,就没法保存数据了。 ...

还想问一下
上边的程序用Subroutine里的参数声明了Jacobi的大小,这里并没有报错呀,这是为什么

81

帖子

0

主题

0

精华

专家

F 币
471 元
贡献
232 点

规矩勋章新人勋章元老勋章

QQ
5#
发表于 2022-4-14 16:22:27 | 只看该作者
Save属性的参数,会保存起来,函数返回后仍然存活。
而自动数组,它的大小每次函数调用,参数(无论输入参数还是输出参数)不同大小就不同,逻辑上两者就冲突,没法“即存起来,又每次大小不同”
彼岸,有永恒的守候...

10

帖子

4

主题

0

精华

入门

F 币
53 元
贡献
28 点
6#
 楼主| 发表于 2022-4-14 19:09:16 | 只看该作者
青衣巷 发表于 2022-4-14 16:22
Save属性的参数,会保存起来,函数返回后仍然存活。
而自动数组,它的大小每次函数调用,参数(无论输入参 ...

所以Save语句后的数组在声明时,其在各个维度上的大小必须是常数是吗?

81

帖子

0

主题

0

精华

专家

F 币
471 元
贡献
232 点

规矩勋章新人勋章元老勋章

QQ
7#
发表于 2022-4-14 22:25:25 | 只看该作者
本帖最后由 青衣巷 于 2022-4-14 22:31 编辑

可分配数组也可以save
具有save属性的变量,你可以理解为定义在一个特殊的空间里。
它具有永久的生命周期(指本程序的实例开始执行到进程退出),但只具有当前子程序范围内的作用域
可以思考以下子程序,尝试去掉 save 属性再试试:
[Fortran] 纯文本查看 复制代码
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


彼岸,有永恒的守候...

10

帖子

4

主题

0

精华

入门

F 币
53 元
贡献
28 点
8#
 楼主| 发表于 2022-4-16 09:11:56 | 只看该作者
青衣巷 发表于 2022-4-14 22:25
可分配数组也可以save
具有save属性的变量,你可以理解为定义在一个特殊的空间里。
它具有永久的生命周期( ...

好的,谢谢,我琢磨一下,
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-24 00:10

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表