程序出现"Stack Overflow"怎么办?(50分)

  • 主题发起人 主题发起人 suckey
  • 开始时间 开始时间
S

suckey

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序具体是这样的,
首先一个主窗体,里面嵌入一个子窗体,子窗体里头有个image,
这时我要做的操作是image中鼠标点击时计算一个数值,计算用到的函数
在另外一个文件中已经定义好了,而计算时需要用到主窗体对象的数据,
我把主窗体的数据已经设置为public了,此程序一旦运行到在image窗口
点击单步执行到计算函数时就跳出stack overflow出错,怎么办?
谢谢。
 
我定义了一个数据结构和一个子结构。
在运行时也遇到了同样的问题。
 
stack overflow是堆栈溢错误!
是不是出现了死循环...导致堆栈溢出了?
贴出计算代码来看看???
 
不是死循环,用到的函数还没运行就出现这个了呢。
后来我改了代码可以了,是不是每个function设定的变量
不能太多啊?变量多了需要用到的堆栈也多?
 
会不是变量有同名现象?
我也认为是死循环,可能是潜在的。
 
点project->options菜单,选Linker,在Memory size部分中,把Min stack size从$00004000改成$00040000,把Max stack size从$00100000改成$01000000,点OK就行了。不会出现堆栈溢出的问题了。
 
>>变量多了需要用到的堆栈也多?
对,因为所有参数要通过压栈才能进入函数体内,而且通常,参数是按照拷贝的方式压栈的,对于shortstring或者string或者定长的array等类型,建议在声明的时候加上const或者var,这样将避免压栈的时候对参数进行拷贝。
 
改大了就填不满? 还没试过。
 
>>变量多了需要用到的堆栈也多?
对,因为所有参数要通过压栈才能进入函数体内,而且通常,参数是按照拷贝的方式压栈的,对于shortstring或者string或者定长的array等类型,建议在声明的时候加上const或者var,这样将避免压栈的时候对参数进行拷贝。
 
这是我定义的结构。
type
Table1=record
LINK11:Integer;
INT11:Integer;
end;
type
Table2=record
LINK12:Integer;
INT12:Integer;
end;
type
Table3=record
LINK13:Integer;
INT13:Integer;
end;
type
Table4=record
LINK14:Integer;
INT14:Integer;
end;
type
Table5=record
LINK21:Integer;
INT21:Integer;
end;
type
Table6=record
LINK22:Integer;
INT22:Integer;
end;
type
Table7=record
LINK23:Integer;
INT23:Integer;
end;
type
Table8=record
LINK24:Integer;
INT24:Integer;
end;
type
Table=record
ID:Integer;
NAME:String;
TAG:Integer;
EVENT:Integer;
BRANCH1:Integer;
JOINT11:Array of Table1;
JOINT12:Array[0..200] of Table2;
JOINT13:Array[0..200] of Table3;
JOINT14:Array[0..200] of Table4;
{JOINT11:Integer;
JOINT12:Integer;
JOINT13:Integer;
JOINT14:Integer;}
BRANCH2:Integer;
JOINT21:Array[0..200] of Table5;
JOINT22:Array[0..200] of Table6;
JOINT23:Array[0..200] of Table7;
JOINT24:Array[0..200] of Table8;
{JOINT21:Integer;
JOINT22:Integer;
JOINT23:Integer;
JOINT24:Integer;}
STATE:Integer;
POINT1:Tpoint;
POINT2:Tpoint;
end;

var
Array1:Array[0..200] of Table;
 
后退
顶部