标题:溢出堆栈空间问题
只看楼主
sncelpl
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2006-6-28
结帖率:86.67%
已结贴  问题点数:5 回复次数:5 
溢出堆栈空间问题
Dim a As String, b As String, c As String, d As String, e As String, m As String, n As String, Y As String

Function max(a, b)
max = IIf(a > b, a, b)
End Function
Function min(a, b)
min = IIf(a < b, a, b)
End Function
Sub tSum()
a = Val(Text5(4))
b = Val(Text5(5))
c = Val(Text5(6))
m = max(a, max(b, c))
n = min(a, min(b, c))
Static s
If Text5(4) <> "" Then
s = s + 1
End If
If Text5(5) <> "" Then
s = s + 1
End If
If Text5(6) <> "" Then
s = s + 1
End If
If Text5(4).Text = "" And Text5(5).Text = "" And Text5(6).Text = "" Then
Else
Y = (Val(Text5(4)) + Val(Text5(5)) + Val(Text5(6))) / s
s = 0
Text5(7).Text = (m - n) / Y
Text5(7).Text = Format(Text5(7), "0.00%")
End If
a = Val(Text5(0))
b = Val(Text5(1))
c = Val(Text5(2))
m = max(a, max(b, c))
n = min(a, min(b, c))
Static w
If Text5(0) <> "" Then
w = w + 1
End If
If Text5(1) <> "" Then
w = w + 1
End If
If Text5(2) <> "" Then
w = w + 1
End If
If Text5(0).Text = "" And Text5(1).Text = "" And Text5(2).Text = "" Then
Else
Y = (Val(Text5(0)) + Val(Text5(1)) + Val(Text5(2))) / w
w = 0
Text5(3).Text = (m - n) / Y
Text5(3).Text = Format(Text5(3), "0.00%")
End If
End Sub

Private Sub Text5_Change(Index As Integer)
Call tSum
End Sub
运行填数后要报"溢出堆栈空间"
那位老大帮我看下要怎么改
搜索更多相关主题的帖子: Text Then String End If 
2022-05-18 11:52
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:33
帖 子:1883
专家分:2904
注 册:2009-12-22
得分:2 
为什么要字符串直接比较大小呢?不解。

字符串还可以直接Format(Text5(7), "0.00%"),妙....

心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2022-05-18 13:30
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:2 
搭建测试工程才找到你 为什么会 报溢出堆栈空间 了。

首先,这个事件,会导致 调用 tSum 过程。
Private Sub Text5_Change(Index As Integer)
Call tSum
End Sub

然后在 tSum 过程 ,以下4句,会修改 Text5 某个控件 的值。
Text5(7).Text = (m - n) / Y
Text5(7).Text = Format(Text5(7), "0.00%")

Text5(3).Text = (m - n) / Y
Text5(3).Text = Format(Text5(3), "0.00%")
用代码 修改控件值会导致什么事件呢?很不幸是产生 Change 事件,导致 Text5_Change 事件被触发,
而 Text5_Change 事件被触发,导致重新调用 tSum ,无限死循环
程序调用过程,需要把前一次过程里的入口地址什么的压到堆栈里,这种无限死循环的调用,堆栈很快就被压满掉了。
-----------------
不知道你程序逻辑的情况,只能提出修改建议了。
一、程序启动事件,不要使用 Change 事件。
二、或者在 Change 事件中加了一个判断,凡 tsum 里产生的 Change 事件忽略掉。如加一个标志变量。


授人于鱼,不如授人于渔
早已停用QQ了
2022-05-18 15:48
sncelpl
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2006-6-28
得分:0 
回复 3楼 风吹过b
不加调用就不自动计算啊
不用数组不会报错。
如能单个写Private Sub Text5_Change(Index As Integer)应该可以
怎么这样写我就不会了Private Sub Text5(0)_Change(Index As Integer)

[此贴子已经被作者于2022-5-18 18:09编辑过]

2022-05-18 18:04
cwa9958
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:247
专家分:1228
注 册:2006-6-25
得分:2 
用于输出数据的控件不要与输入数据的控件用相同的名字。
把text5(3)和text5(7)用不同的控件名称。
还有,参与计算的变量要定义为数值变量,把Dim a As String, b As String, c As String, d As String, e As String, m As String, n As String, Y As String改为
Dim a As single, b As single, c As single, d As single, e As single, m As single, n As single, Y As single
2022-05-19 08:30
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
方法二的修改方法

dim NoChange as Boolean
Sub tSum()
NoChange = true
.....

NoChange=false
end sub

Private Sub Text5_Change(Index As Integer)
if not NoChange then
    Call tSum
end if
End Sub

----------------------------------
分析:
NoChange 没有给值时,原始值为 false
这时,触发 text5_Change 时,not NoChange 值为真,调用 tSum 过程。
而在 tSum 过程中,第一句就是 给 NoChange 值为真,
当修改 text5 值时,触发 text5_Change 时,not NoChange 值为假,不会再调用 tSum 过程。



授人于鱼,不如授人于渔
早已停用QQ了
2022-05-19 09:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509110-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.253629 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved