Fortran Coder

标题: allocatable和pointer区别 [打印本页]

作者: caimaxwell    时间: 2023-5-10 21:22
标题: allocatable和pointer区别
想问问前辈们,在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



作者: li913    时间: 2023-5-10 22:45
type(Subblocks), allocatable :: Subblocks(:)
这里Subblocks重名了,其他没问题。
作者: 楚香饭    时间: 2023-5-11 08:39
allocatable 在生命周期结束时,编译器会自动释放。而 pointer 不会。
作者: caimaxwell    时间: 2023-5-11 10:59
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
楚香饭 发表于 2023-5-11 08:39
allocatable 在生命周期结束时,编译器会自动释放。而 pointer 不会。

谢谢前辈的回答,但是我还有疑问,能够自动释放的话,那deallocate是干啥的?
作者: li913    时间: 2023-5-11 11:03
caimaxwell 发表于 2023-5-11 10:59
这地方的重名会有影响吗?我的原意是写一个iblocks(i)%subblocks(j)%nr(a1:b1,a2:b2)。我需要修改一下嘛 ...

编译可以通过,但是容易混乱。例如 fortran允许定义一个变量 叫 real,但没人这么干。
作者: li913    时间: 2023-5-11 11:07
caimaxwell 发表于 2023-5-11 11:02
谢谢前辈的回答,但是我还有疑问,能够自动释放的话,那deallocate是干啥的? ...

deallocate可以释放动态数组或指针。动态数组自动释放只发生在退出作用域时,当然一般会手写deallocate,更规范,更方便阅读。如果中途需要释放或重新分配,只能手动。
作者: caimaxwell    时间: 2023-5-11 11:28
li913 发表于 2023-5-11 11:03
编译可以通过,但是容易混乱。例如 fortran允许定义一个变量 叫 real,但没人这么干。 ...

以上代码里,将21行的SUMatrix注释掉程序可运行,为什么不注释程序就跑不了了呢?在某行加个write程序又能跑,但是之前没问题的地方又报错(比如矩阵求逆,注释掉矩阵求逆没问题,不注释矩阵就求逆错误),这个大概是什么问题呢?求解答
作者: 楚香饭    时间: 2023-5-11 11:35
光说报错,跑不了。不说错误提示,现象,截图。等于甩流氓
作者: caimaxwell    时间: 2023-5-11 11:51
本帖最后由 caimaxwell 于 2023-5-11 11:53 编辑


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

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

222.png

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

111.png

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

1. 释放pointer也需要deallocate
2. 在生命周期结束前,手动释放,某些情况下,也是有必要的。
例如,手动释放后重新分配成其他大小,手动释放以减少内存占用(给其他数据腾出内存)
作者: 楚香饭    时间: 2023-5-11 14:38
caimaxwell 发表于 2023-5-11 11:51
111是不注释的报错,222是不注释,且在某行加个write的报错。原来矩阵求逆是没问题的
...

根据你的代码片段和错误提示,无法直接检查出原因。

可能的情况是:
1. 内存占用过大,导致堆栈或其他内存部分处于溢出或濒临溢出的边缘。出现一些细微变化就导致两种后果。尝试改到64位编译?
2. 注释掉 SUMatrix 后,你改动了其他部分。因为我想你不太可能定义一个从来不用到的数组。
3. 你是否调用了其他第三方函数库,或者其他语言编写的内容部分。导致堆栈失衡?
作者: caimaxwell    时间: 2023-5-11 16:55
问题没解决,但是run起来了,只是在某行加了个write.....所以算解决了..   谢谢前辈们!




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2