asp 运行产生堆栈溢出的问题,如何解决?

asd119cn 2005-05-27 04:42:50
我在页面里面运行了一个读取随机数的的递归程序。
运行产生了一个堆栈错误。这个错误应该如何解决? 还有产生的原因是什么,要怎么避免。

我的程序大概是这样的。

exam=rse.fields("exam_question") '读取考试题目,存储类似于1|2|3|4|5|6|这样的形式
total_num=rse.fields("exam_mark")
exam=split(exam,"|")
question="|"
mark=0
AI="|"
ssQ=rse.fields("ssQ") '读取题目数量
smQ=rse.fields("smQ")
ynQ=rse.fields("ynQ")
lsQ=rse.fields("lsq")
makeMark ssq,smq,ynq,lsq '开始计算
sub makeMark(ssQ,smQ,ynQ,lsQ) 'ss 单选题目数量,sm,多选题目数量,yn,判断题目数量 ls,论述题
if smnum+ssnum+ynnum+lsnum = ssq + smq+ynQ+lsQ then exit sub '题目数量达到指定数量,退出
randomize
i = cint(rnd(ubound(exam))*ubound(exam)) '随机读取exam这个数组中的数字
if i >0 and instr(Ai,"|" & i & "|")=0 then '判断数字是否读取过。如果读取过重新随机。
x = exam(i-1) '读取该数字
t= "|" & x & "|"
if instr(question,t)= 0 then '判断该题目是否读取过。读取过退出
set rsqu=server.createobject("adodb.recordset")
mysql = "select * from Exam_Question where id = " & x
rsqu.open mysql,econn,1,1
select case rsqu.fields("question_type")
case 1 '多选
if smnum=smQ then makeMark ssQ,smQ,ynQ,lsQ '题目数量到达指定数量 ,则继续循环
smnum=smnum+1
case 2 '单选
if ssnum=ssQ then makeMark ssQ,smQ,ynQ,lsQ
ssnum=ssnum+1
case 3 '判断
if ynnum=ynQ then makeMark ssQ,smQ,ynQ,lsQ
ynnum=ynnum+1
case 4 '论述题
if lsnum=lsQ then makeMark ssQ,smQ,ynQ,lsQ
lsnum=lsnum+1
end select

question=question & x & "|" '保存题目到question变量
anum=smnum+ssnum+ynnum+lsnum
if anum=ssQ+smQ+ynQ+lsQ then exit sub'分数累加
end if
ai=ai & i & "|" ' 保存已经随机过的数字。
end if
makeMark ssQ,smQ,ynQ,lsQ '继续循环。
end sub

...全文
167 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
asd119cn 2005-05-28
  • 打赏
  • 举报
回复
问题搞定了,多谢大家帮忙,只是自己逻辑上出了点问题,累加没有进行,所以造成了死循环了。

exam=rse.fields("exam_question") '读取考试题目,存储类似于1|2|3|4|5|6|这样的形式
total_num=rse.fields("exam_mark")
exam=split(exam,"|")
question="|"
mark=0
AI="|"
ssQ=rse.fields("ssQ") '读取题目数量
smQ=rse.fields("smQ")
ynQ=rse.fields("ynQ")
lsQ=rse.fields("lsq")
smnum=0
ssnum=0
ynnum=0
lsnum=0
makeMark ssQ,smQ,ynQ,lsQ,smnum,ssnum,ynnum,lsnum '开始计算
sub makeMark(ssQ,smQ,ynQ,lsQ,smnum,ssnum,ynnum,lsnum) 'ss 单选题目数量,sm,多选题目数量,yn,判断题目数量 ls,论述题
add=0
if smnum+ssnum+ynnum+lsnum = ssq+smq+ynQ+lsQ then exit sub '题目数量达到指定数量,退出
randomize
i = cint(rnd(ubound(exam))*ubound(exam)) '随机读取exam这个数组中的数字
'i=Int((ubound(exam) - lbound(exam) + 1) * Rnd + lbound(exam))
if i >0 and instr(Ai,"|" & i & "|")=0 then '判断数字是否读取过。如果读取过重新随机。
x = exam(i-1) '读取该数字
t= "|" & x & "|"
if instr(question,t)= 0 then '判断该题目是否读取过。读取过退出
set rsqu=server.createobject("adodb.recordset")
mysql = "select * from Exam_Question where id = " & x
rsqu.open mysql,econn,1,1
select case rsqu.fields("question_type")
case 1 '多选
if smnum<>smQ then
smnum=smnum+1
add=1
end if
case 2 '单选
if ssnum<>ssQ then
ssnum=ssnum+1
add=1
end if
case 3 '判断
if ynnum<>ynQ then
ynnum=ynnum+1
add=1
end if
case 4 '论述题
if lsnum<>lsQ then
lsnum=lsnum+1
add=1
end if
end select
if add=1 then
question=question & x & "|" '保存题目到question变量
end if
anum=smnum+ssnum+ynnum+lsnum
if anum=ssQ+smQ+ynQ+lsQ then exit sub'分数累加
end if
ai=ai & i & "|" ' 保存已经随机过的数字。
end if
makeMark ssQ,smQ,ynQ,lsQ,smnum,ssnum,ynnum,lsnum '继续循环。
end sub
fantiny 2005-05-27
  • 打赏
  • 举报
回复
如果只是做做选择数据的话
你可以不用recordset,
就用conn.excute(sql)就可以了。
跟recordset比较,
excute耗资源更少。
asd119cn 2005-05-27
  • 打赏
  • 举报
回复
cint绝对不会出错。随机的数字不会超过4位数。

createobject是放到循环里的,因为需要根据随机出来的数据,去数据库中读取,然后根据取回来的数据判断是否需要继续循环的。我还没想到更好的办法。

hzw66 2005-05-27
  • 打赏
  • 举报
回复
原因一定是出现了无穷的子过程递归
下断点,分析原因
fantiny 2005-05-27
  • 打赏
  • 举报
回复
你这里面容易错的地方有
cint() cint的时候应该先判断一下数值是否会超过范围。

i = cint(rnd(ubound(exam))*ubound(exam)) '随机读取exam这个数组中的数字
两个数值事件的随机数应该为
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

还有你createobject是不是放在循环里面的?如果是的话,请放到循环外面。

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧