主题:请教:如何解决指针悬挂问题?
2o12oo
[专家分:30] 发布于 2010-06-18 17:10:00
我想用把一个指针数组作为函数(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个回复)
沙发
adda [专家分:1520] 发布于 2010-06-19 15:42:00
把allocate语句放在函数外面,先分配数组,再调用此函数为其赋值
如果BASISNUM是在引用的模块中定义的话,可将hx声明为普通数组
REAL::HX(BASISNUM)
板凳
asymptotic [专家分:16630] 发布于 2010-06-19 23:10:00
个人觉得,用如下形式就可以满足要求了
FUNCTION MULT(BASISNUM, X) RESULT(HX)
IMPLICIT NONE
integer, intent(in):: BASISNUM
REAL:: X(1 : BASISNUM)
REAL, intent(out):: HX(1 : HXBASISNUM)
! ...
3 楼
adda [专家分:1520] 发布于 2010-06-20 09:55:00
或者可以这样声明:
REAL::HX(size(x))
4 楼
adda [专家分:1520] 发布于 2010-06-20 09:57:00
function mult(x) result(hx)
implicit none
integer i,ind_1,ind_2
real, dimension(:), intent(in)::x
real :: hx( size(x) )
5 楼
喷泉是天蓝色的 [专家分:30] 发布于 2010-06-20 19:04:00
把allocate语句放在函数外面,先分配数组,再调用此函数为其赋值如果BASISNUM是在引用的模块中定义的话,可将hx声明为普通数组REAL:HX(BASISNUM)
6 楼
春上春数 [专家分:90] 发布于 2010-06-20 19:05:00
把allocate语句放在函数外面,先分配数组,再调用此函数为其赋值如果BASISNUM是在引用的模块中定义的话,可将hx声明为普通数组REAL:HX(BASISNUM)
7 楼
春上春数 [专家分:90] 发布于 2010-06-20 19:06:00
把allocate语句放在函数外面,先分配数组,再调用此函数为其赋值如果BASISNUM是在引用的模块中定义的话,可将hx声明为普通数组REAL:HX(BASISNUM)
8 楼
2o12oo [专家分:30] 发布于 2010-06-22 19:39:00
[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 楼
adda [专家分:1520] 发布于 2010-06-22 22:30:00
real::hx(10000) ! hx在栈上
allocate(hx(10000)) ! hx在堆上
栈的大小是有限的, 所以会发生溢出.
你的问题, 我觉得可以:
1. 在调用函数前分配空间
2. 增大栈空间大小. 在编译器的设置中可以修改
10 楼
2o12oo [专家分:30] 发布于 2010-06-24 21:41:00
谢谢adda,你说的第二点我之前已经试过,但总觉得这只是权宜之计,至于第一点,我不是很理解,可以说的详细点吗?
我来回复