回 帖 发 新 帖 刷新版面

主题:请高手帮忙解决一个指针方面的问题,不胜感激

我想用一个数组与地址不连续的几个变量的值,始终保持一致,不知道有没有好的解决办法?

例如:有一些各子程序中需要经常使用的变量a,b,c(2),我想用一个数组arr(4)分别存储a,b,c(2),且不管a,b,c(2)中的值如何变化,arr(4)中的值始终与a,b,c(2)中的值保持一致(arr(1)=a,arr(2)=b,arr(3)=c(1),arr(4)=c(2))。

我试过用指针,发现指针数组似乎只能指向与其大小匹配的数组,而不能指向单个变量,例如:

real,target :: a,b,c(2)
real,pointer :: arr(:)
a=1.0
b=2.0
c(1)=3.0
c(2)=4.0
allocate(arr(4))
arr(1)=>a
arr(2)=>b
arr(3:4)=>c
end

编译发生错误:
Compiling Fortran...
D:\test\test.f90
D:\test\test.f90(8) : Error: Object is not a pointer object   [ARR]
arr(1)=>a
^
D:\test\test.f90(9) : Error: Object is not a pointer object   [ARR]
arr(2)=>b
^
D:\test\test.f90(10) : Error: Object is not a pointer object   [ARR]
arr(3:4)=>c

望能得到高手的指点,不胜感激!

回复列表 (共8个回复)

沙发

定义成pointer,用过allocate分配空间后,为什么就不是指针了呢?

板凳

似乎很棘手,平时那么多热心人都不见提点意见,急死了

3 楼

real, pointer:: arr(:) == real, dimension(:), pointer:: arr
说明指针 arr 指向 rank = 1 的数组。arr(1) 为数组元素


请注意区别 C 语言中的指针。

4 楼

没太明白,有没有办法实现我所述的功能呢?请指点

5 楼

我想这个问题应该有人遇到过,思考过的

6 楼

具体这个问题,我想 用 assignment 最简单
  arr(1) = a 
  arr(2) = b 
  arr(3 :4 ) = c(1 : 2)

就你问问题的本质来说,应该是 storage association,可遗憾的是 equivalence 语句无法适用于动态内存。

另外,你最好提出具体问题。

7 楼


下面的语句只是将各变量中的值取给arr,当a,b,c在其它地方发生改变时,arr不会对应改变的,因为他们之间根本就没有建立链接关系
  arr(1) = a 
  arr(2) = b 
  arr(3 :4 ) = c(1 : 2)

我就只是想建立一个与一些关系不大的数据,用一个连续的数组统一管理,即示例中无论a,b,c如何变化,始终有
  arr(1) = a 
  arr(2) = b 
  arr(3 :4 ) = c(1 : 2)
成立
这样的好处在于:(1)子程序中数据传递方便;(2)数据使用方便;(3)数据好管理。
至于实际例子,我的程序比较复杂,不好在此处附上,所以用上述例子简化描述了。

谢谢你不辞辛苦的帮助[em2]

8 楼

其实,你就用数组就可以了,至于你所谓的复杂一点,就是加个下标而已。

若是一定要实现你的“想法”,用 derived-type。

type:: Array_Pointer
  real, pointer:: Arr(:)
end type

type(Array_Pointer):: AP(5)

我来回复

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