回 帖 发 新 帖 刷新版面

主题:请教:如何解决指针悬挂问题?

我想用把一个指针数组作为函数(Function)的输出值,该数组是一维的,但元素很多,但编程时遇到了指针悬挂的问题,程序运行过程中内存占据越来越大,想请教一下大家如何避免这个问题?(程序里出现的未说明的变量是全局变量)
FUNCTION MULT(X) RESULT(HX)
IMPLICIT NONE
INTEGER I,IND_1,IND_2
REAL,DIMENSION(:),POINTER::X
REAL,DIMENSION(:),POINTER::HX
ALLOCATE(HX(BASISNUM))
HX=0
DO I=1,TNUM
  IND_1=T_IND(I,1)
  IND_2=T_IND(I,2)
  HX(IND_1)=HX(IND_1)+T_SP*X(IND_2)
  HX(IND_2)=HX(IND_2)+T_SP*X(IND_1)
ENDDO
DO I=1,UNUM
  IND_1=U_IND(I)
  IND_2=U_IND(I)
  HX(IND_1)=HX(IND_1)+U_SP(I)*X(IND_2)
ENDDO
END FUNCTION MULT

回复列表 (共10个回复)

沙发

把allocate语句放在函数外面,先分配数组,再调用此函数为其赋值

如果BASISNUM是在引用的模块中定义的话,可将hx声明为普通数组

REAL::HX(BASISNUM)

板凳

个人觉得,用如下形式就可以满足要求了

FUNCTION MULT(BASISNUM, X) RESULT(HX)
IMPLICIT NONE
integer, intent(in):: BASISNUM
REAL:: X(1 : BASISNUM)
REAL, intent(out):: HX(1 : HXBASISNUM)
! ...

3 楼

或者可以这样声明:

REAL::HX(size(x))

4 楼

function mult(x) result(hx)
implicit none
integer i,ind_1,ind_2
real, dimension(:), intent(in)::x
real :: hx( size(x) )

5 楼

把allocate语句放在函数外面,先分配数组,再调用此函数为其赋值如果BASISNUM是在引用的模块中定义的话,可将hx声明为普通数组REAL:HX(BASISNUM)

6 楼

把allocate语句放在函数外面,先分配数组,再调用此函数为其赋值如果BASISNUM是在引用的模块中定义的话,可将hx声明为普通数组REAL:HX(BASISNUM)

7 楼

把allocate语句放在函数外面,先分配数组,再调用此函数为其赋值如果BASISNUM是在引用的模块中定义的话,可将hx声明为普通数组REAL:HX(BASISNUM)

8 楼

[quote]function mult(x) result(hx)
implicit none
integer i,ind_1,ind_2
real, dimension(:), intent(in)::x
real :: hx( size(x) )
[/quote]
谢谢adda,我以前也是这样编的,但因为那个输入值x的维数太大,调用这个函数时发生了堆栈溢出的错误(real :: hx( size(x) )),当把括号中的那句改为
real,dimension(:),allocatable::hx
allocate(hx(size(x)))
时,堆栈溢出的错误就可避免,在做这件事时,我把这个函数写到了主程序里了,因为函数的输出好像不能为动态数组。为了再把这段程序写为一个函数,我发现可以使用指针这个工具,这样的话就可以如下定义(函数输出可以为指针)
real,dimension(:),pointer::hx
allocate(hx(basisnum))
这样做以后,函数的功能是实现了,但随即又发生了指针悬挂的问题。
现在我有两个困惑,首先是
real::hx(10000)

real,dimension(:),allocatable::hx
allocate(hx(10000))
有什么不同,为什么前者会发生堆栈溢出而后者不会?
第二就是如何使用指针数组作为函数输出值而避免内存悬挂?

9 楼

real::hx(10000)   ! hx在栈上

allocate(hx(10000))    ! hx在堆上

栈的大小是有限的, 所以会发生溢出.

你的问题, 我觉得可以:
1. 在调用函数前分配空间
2. 增大栈空间大小. 在编译器的设置中可以修改

10 楼

谢谢adda,你说的第二点我之前已经试过,但总觉得这只是权宜之计,至于第一点,我不是很理解,可以说的详细点吗?

我来回复

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