Fortran Coder

查看: 195|回复: 12

[指针] allocatable和pointer区别

[复制链接]

37

帖子

10

主题

0

精华

熟手

F 币
133 元
贡献
77 点
发表于 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


748

帖子

2

主题

0

精华

大宗师

F 币
3593 元
贡献
2183 点
发表于 2023-5-10 22:45:17 | 显示全部楼层
type(Subblocks), allocatable :: Subblocks(:)
这里Subblocks重名了,其他没问题。

676

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
469 元
贡献
235 点

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

发表于 2023-5-11 08:39:24 | 显示全部楼层
allocatable 在生命周期结束时,编译器会自动释放。而 pointer 不会。

37

帖子

10

主题

0

精华

熟手

F 币
133 元
贡献
77 点
 楼主| 发表于 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)。我需要修改一下嘛?谢谢前辈的解答!

37

帖子

10

主题

0

精华

熟手

F 币
133 元
贡献
77 点
 楼主| 发表于 2023-5-11 11:02:36 | 显示全部楼层
楚香饭 发表于 2023-5-11 08:39
allocatable 在生命周期结束时,编译器会自动释放。而 pointer 不会。

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

748

帖子

2

主题

0

精华

大宗师

F 币
3593 元
贡献
2183 点
发表于 2023-5-11 11:03:06 | 显示全部楼层
caimaxwell 发表于 2023-5-11 10:59
这地方的重名会有影响吗?我的原意是写一个iblocks(i)%subblocks(j)%nr(a1:b1,a2:b2)。我需要修改一下嘛 ...

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

748

帖子

2

主题

0

精华

大宗师

F 币
3593 元
贡献
2183 点
发表于 2023-5-11 11:07:32 | 显示全部楼层
caimaxwell 发表于 2023-5-11 11:02
谢谢前辈的回答,但是我还有疑问,能够自动释放的话,那deallocate是干啥的? ...

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

37

帖子

10

主题

0

精华

熟手

F 币
133 元
贡献
77 点
 楼主| 发表于 2023-5-11 11:28:19 | 显示全部楼层
li913 发表于 2023-5-11 11:03
编译可以通过,但是容易混乱。例如 fortran允许定义一个变量 叫 real,但没人这么干。 ...

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

676

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
469 元
贡献
235 点

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

发表于 2023-5-11 11:35:52 | 显示全部楼层
光说报错,跑不了。不说错误提示,现象,截图。等于甩流氓

37

帖子

10

主题

0

精华

熟手

F 币
133 元
贡献
77 点
 楼主| 发表于 2023-5-11 11:51:15 | 显示全部楼层
本帖最后由 caimaxwell 于 2023-5-11 11:53 编辑


111是不注释的报错,222是不注释,且在某行加个write的报错。原来矩阵求逆是没问题的
222.png
111.png
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2023-6-7 03:43

Powered by Tencent X3.4

© 2013-2023 Tencent

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