Fortran Coder

查看: 3400|回复: 12
打印 上一主题 下一主题

[指针] allocatable和pointer区别

[复制链接]

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
跳转到指定楼层
楼主
发表于 2023-5-10 21:22:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
想问问前辈们,在type时,allocatable和pointer区别。我这里的type下,把SUMatrix注释掉,就能跑,加上这个SUMatrix就报错,是什么原因呢?
[Fortran] 纯文本查看 复制代码
type Subblocks
    integer*4  :: row
    integer*4  :: coL
    complex*16, dimension(:,:), pointer :: far
    complex*16, dimension(:,:), pointer :: nar
    complex*16, dimension(:,:), pointer :: nra
    complex*16, dimension(:,:), pointer :: nrb
    complex*16, dimension(:,:), pointer :: fr
  end type Subblocks

  type blocks
    integer*4  :: row1,row2,coL1,coL2
    integer*4  :: rowm,coLm
    integer*4  :: dad
    integer*4  :: son(4)
    integer*4  :: bnum, begin, sbnum
    type(Subblocks), allocatable :: Subblocks(:)
    complex*16, allocatable :: invMatrix(:,:)
    complex*16, allocatable :: offMatrix(:,:)
    complex*16, allocatable :: Matrix(:,:)
    complex*16, allocatable :: SUMatrix(:,:)
 !   complex*16, allocatable :: SVMatrix(:,:)
  end type blocks


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

834

帖子

2

主题

0

精华

大宗师

F 币
3922 元
贡献
2332 点
沙发
发表于 2023-5-10 22:45:17 | 只看该作者
type(Subblocks), allocatable :: Subblocks(:)
这里Subblocks重名了,其他没问题。

718

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
632 元
贡献
323 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

板凳
发表于 2023-5-11 08:39:24 | 只看该作者
allocatable 在生命周期结束时,编译器会自动释放。而 pointer 不会。

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
地板
 楼主| 发表于 2023-5-11 10:59:18 | 只看该作者
li913 发表于 2023-5-10 22:45
type(Subblocks), allocatable :: Subblocks(:)
这里Subblocks重名了,其他没问题。

这地方的重名会有影响吗?我的原意是写一个iblocks(i)%subblocks(j)%nr(a1:b1,a2:b2)。我需要修改一下嘛?谢谢前辈的解答!

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
5#
 楼主| 发表于 2023-5-11 11:02:36 | 只看该作者
楚香饭 发表于 2023-5-11 08:39
allocatable 在生命周期结束时,编译器会自动释放。而 pointer 不会。

谢谢前辈的回答,但是我还有疑问,能够自动释放的话,那deallocate是干啥的?

834

帖子

2

主题

0

精华

大宗师

F 币
3922 元
贡献
2332 点
6#
发表于 2023-5-11 11:03:06 | 只看该作者
caimaxwell 发表于 2023-5-11 10:59
这地方的重名会有影响吗?我的原意是写一个iblocks(i)%subblocks(j)%nr(a1:b1,a2:b2)。我需要修改一下嘛 ...

编译可以通过,但是容易混乱。例如 fortran允许定义一个变量 叫 real,但没人这么干。

834

帖子

2

主题

0

精华

大宗师

F 币
3922 元
贡献
2332 点
7#
发表于 2023-5-11 11:07:32 | 只看该作者
caimaxwell 发表于 2023-5-11 11:02
谢谢前辈的回答,但是我还有疑问,能够自动释放的话,那deallocate是干啥的? ...

deallocate可以释放动态数组或指针。动态数组自动释放只发生在退出作用域时,当然一般会手写deallocate,更规范,更方便阅读。如果中途需要释放或重新分配,只能手动。

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
8#
 楼主| 发表于 2023-5-11 11:28:19 | 只看该作者
li913 发表于 2023-5-11 11:03
编译可以通过,但是容易混乱。例如 fortran允许定义一个变量 叫 real,但没人这么干。 ...

以上代码里,将21行的SUMatrix注释掉程序可运行,为什么不注释程序就跑不了了呢?在某行加个write程序又能跑,但是之前没问题的地方又报错(比如矩阵求逆,注释掉矩阵求逆没问题,不注释矩阵就求逆错误),这个大概是什么问题呢?求解答

718

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
632 元
贡献
323 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

9#
发表于 2023-5-11 11:35:52 | 只看该作者
光说报错,跑不了。不说错误提示,现象,截图。等于甩流氓

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
10#
 楼主| 发表于 2023-5-11 11:51:15 | 只看该作者
本帖最后由 caimaxwell 于 2023-5-11 11:53 编辑


111是不注释的报错,222是不注释,且在某行加个write的报错。原来矩阵求逆是没问题的

222.png (10.78 KB, 下载次数: 241)

222.png

111.png (129.26 KB, 下载次数: 230)

111.png
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-1 06:50

Powered by Tencent X3.4

© 2013-2024 Tencent

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