回 帖 发 新 帖 刷新版面

主题:指针指向关系的作用域

程序中的一个问题,程序基本结构如下:

module fv
implicit none
type derivedType
    real,pointer :: fun(:)
end type
end module

program test
use fv
implicit none
type(derivedType) :: array(1:2)
real :: x(1:8)

x = 0.
array(1)%fun => x(1:4)
array(2)%fun => x(5:8)
call f1(x)

contains
subroutine f1(x)
...
end subroutine

问题为:
1 先将指针指向x,调用子程序f1时,f1内部并没有将array和x关联起来;
2 在f1内部将array指向x后程序运行正常,但返回到主程序中后array数组中只有一个与x的相应部分关联。

对指针的这种指向关系是否在内部子程序中继续作用不太清楚,请问以上两个问题如何理解?

回复列表 (共3个回复)

沙发

你还是给出 f1 的代码吧。你这样把操作都用文字问出来,不明白你具体怎么做的。

板凳

[quote]你还是给出 f1 的代码吧。你这样把操作都用文字问出来,不明白你具体怎么做的。[/quote]
程序比较长,不过我用以下的代码检测发现和我原来的想法一致,即在主程序中指定的指针和变量的指向关系在内部子程序中也成立,也许我的代码有些问题,我继续测试
end module

program test
use fv
implicit none
type(derivedType) :: array(1:2)
real,target :: x(1:8)

x = 0.
array(1)%fun => x(1:4)
array(2)%fun => x(5:8)
call f1(x)

      write(*,*) associated(array(1)%fun,x(1:4))
      write(*,*) associated(array(2)%fun,x(5:8))
contains
subroutine f1(x)
real,target :: x(1:8)
      print *,array(1)%fun

      x = 2.
      array(1)%fun = 3.
      write(*,*) associated(array(1)%fun,x(1:4))
      write(*,*) associated(array(2)%fun,x(5:8))
      print *,array(1)%fun
end subroutine

end program

3 楼

在主程序中:
array(1)%fun => x(1:4)
array(2)%fun => x(5:8)

此时 array 指针在contains下的子程序 f1 中可以继续使用。

而 x 通过虚参传入地址,这个地址的实体在主程序中。所以 array 依然指向 x

这是正常的啊。

你的程序我运行后结果是:

  0.0000000E+00  0.0000000E+00  0.0000000E+00  0.0000000E+00
 T
 T
   3.000000       3.000000       3.000000       3.000000
 T
 T
请按任意键继续. . .

我还是不明白你的问题是什么??你有什么疑问?

我来回复

您尚未登录,请登录后再回复。点此登录或注册