caimaxwell 发表于 2023-5-10 21:22:28

allocatable和pointer区别

想问问前辈们,在type时,allocatable和pointer区别。我这里的type下,把SUMatrix注释掉,就能跑,加上这个SUMatrix就报错,是什么原因呢?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

li913 发表于 2023-5-10 22:45:17

type(Subblocks), allocatable :: Subblocks(:)
这里Subblocks重名了,其他没问题。

楚香饭 发表于 2023-5-11 08:39:24

allocatable 在生命周期结束时,编译器会自动释放。而 pointer 不会。

caimaxwell 发表于 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)。我需要修改一下嘛?谢谢前辈的解答!

caimaxwell 发表于 2023-5-11 11:02:36

楚香饭 发表于 2023-5-11 08:39
allocatable 在生命周期结束时,编译器会自动释放。而 pointer 不会。

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

li913 发表于 2023-5-11 11:03:06

caimaxwell 发表于 2023-5-11 10:59
这地方的重名会有影响吗?我的原意是写一个iblocks(i)%subblocks(j)%nr(a1:b1,a2:b2)。我需要修改一下嘛 ...

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

li913 发表于 2023-5-11 11:07:32

caimaxwell 发表于 2023-5-11 11:02
谢谢前辈的回答,但是我还有疑问,能够自动释放的话,那deallocate是干啥的? ...

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

caimaxwell 发表于 2023-5-11 11:28:19

li913 发表于 2023-5-11 11:03
编译可以通过,但是容易混乱。例如 fortran允许定义一个变量 叫 real,但没人这么干。 ...

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

楚香饭 发表于 2023-5-11 11:35:52

光说报错,跑不了。不说错误提示,现象,截图。等于甩流氓

caimaxwell 发表于 2023-5-11 11:51:15

本帖最后由 caimaxwell 于 2023-5-11 11:53 编辑


111是不注释的报错,222是不注释,且在某行加个write的报错。原来矩阵求逆是没问题的
页: [1] 2
查看完整版本: allocatable和pointer区别