| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3240 人关注过本帖
标题:求助:VB 程序调试出现堆栈空间溢出
只看楼主 加入收藏
huangzhenyu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-3-23
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
求助:VB 程序调试出现堆栈空间溢出
Private Sub Form_Load()
Dim Gam As Double, Gam1 As Double, Gam2 As Double, Gam4 As Double, Vin As Double
Dim X0 As Double, X2 As Double, R As Double, FN As Double, FOFX As Double, Z As Double
Gam = InputBox("请输入绝热指数", "输入绝热指数")
Vin = InputBox("请输入入口普朗特-迈耶角", "输入入口普朗特-迈耶角")
X2 = InputBox("请输入半径取值上限", "输入半径取值上限")
Const Conver = 0.0174532945
Const PI = 3.14159265
Const Increment = 0.1
Gam1 = (Gam + 1#) / 2#
Gam2 = (Gam - 1#) / 2#
Gam4 = Sqr((Gam + 1#) / (Gam - 1#))
X0 = Sqr((Gam - 1#) / (Gam + 1#))
Vin = Vin * Conver
FN = 1#
FOFX = F(Vin, FN)
Call Root(X0, X2, FOFX, FOFRS(Z), R)

End Sub
'//////启动程序设计//////
'//////启动程序设计//////
'//////启动程序设计//////
'//////启动程序设计//////


'//////求解R*的函数//////
'//////求解R*的函数//////
'//////求解R*的函数//////
'//////求解R*的函数//////


'定义函数Root,求解半径值R*
Public Function Root(X0 As Double, X2 As Double, FOFX As Double, FOUNC, X1)
Dim X As Double
Dim XX0 As Double
Dim XX2 As Double
Dim F0 As Double
Dim F2 As Double
Dim FX As Double
XX0 = X0
XX2 = X2
Call FOUNC(XX0)
F0 = FOUNC(XX0)
'Print "FO="; FO; ""
Call FOUNC(XX2)
F2 = FOUNC(XX2)
'Print "F2="; F2; ""
Do
     X = (XX0 + XX2) / 2#
     FX = FOUNC(X)
  If FOFX > FX Then
          XX2 = X
          F2 = FX
       Else
          XX0 = X
          FO = FX
    End If
  Loop Until Abs(XX0 - XX2) < 0.0000000001
     X1 = X
  ' Print "   输出半径X1= "; X1; ""
     Root = X1
End Function

'///定义FOFRS(X)函数,求函数F(R*)的值(方程(10b)),其中X即为所求半径
Public Function FOFRS(X As Double)
Dim Arg1 As Double
Dim Arg2 As Double
    Arg1 = 2# * Gam2 / (X * X) - Gam
    Arg2 = 2# * Gam1 * X * X - Gam
'If -1 <= Arg1 And Arg1 <= 1 And -1 <= Arg2 And Arg2 <= 1 Then
    FOFRS = Gam4 * Asin(Arg1) + Asin(Arg2)
'End If
End Function

'////定义反正弦函数
Public Function Asin(X As Double)
       Asin = Atn(X / Sqr(1# - X * X))
End Function

Public Function F(X As Double, Y As Double)
F(X, Y) = 2# * X - (PI / 2#) * (Gam4 - 1#) - 2# * (Y - 1#) * Increment
End Function

标红部分现实:堆栈空间溢出;
求高手指导,不甚感激!




[ 本帖最后由 huangzhenyu 于 2013-3-23 10:06 编辑 ]
搜索更多相关主题的帖子: 指数 迈耶 
2013-03-23 10:05
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
F(X, Y) = 2# * X - (PI / 2#) * (Gam4 - 1#) - 2# * (Y - 1#) * Increment
没见过这样的写法啊

DO IT YOURSELF !
2013-03-23 10:08
huangzhenyu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-3-23
收藏
得分:0 
回复 2楼 wp231957
这是定义的一个函数,你说没见过这样写,是指啥?
2013-03-23 10:14
huangzhenyu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-3-23
收藏
得分:0 
回复 2楼 wp231957
我刚才改为  :F = 2# * X - (PI / 2#) * (Gam4 - 1#) - 2# * (Y - 1#) * Increment
解决了这个问题
2013-03-23 10:19
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
解决了  结贴啊  嘿嘿

DO IT YOURSELF !
2013-03-23 10:31
huangzhenyu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-3-23
收藏
得分:0 
回复 2楼 wp231957
还得麻烦你一下,我这里将函数Root的某一形参定义为了另一个函数FOUNC,如程序中所示,这样定义可以吗?因为定义时没有给出Founc的形参,但实际上它是有的。结果调试时又出现了错误,不知道原因是不是因为此。谢谢!
2013-03-23 10:37
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4938
专家分:30047
注 册:2008-10-15
收藏
得分:0 
Call FOUNC(XX0)
F0 = FOUNC(XX0)
没看懂。为什么先调用一次,并且不要结果,然后再调用一次,再取结果。

--------------
2 楼提的,这样写,造成 无限次调用 F 函数,自然就堆栈溢出了。
----------------

如果没定义形参,是无法再以参数的形式传递过过,编译器通不过了。
如果这种情况下,要么 重新去定义形参;要么 你把 所用到的变量变量定义为全局变量,让那个函数能访问到。

授人于鱼,不如授人于渔
早已停用QQ了
2013-03-23 10:44
huangzhenyu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-3-23
收藏
得分:0 
回复 7楼 风吹过b
Public Function Root(X0 As Double, X2 As Double, FOFX As Double, FOUNC, X1)

这里FOUNC为单自变量函数,也即是函数Root的一个形参,那以上的这种定义是不是不可以,如何定义呢?即定义了函数Root(给出其所有形参),又定义了函数FOUNC(给出其形参)
2013-03-23 11:09
qq372505855
Rank: 2
等 级:论坛游民
帖 子:42
专家分:46
注 册:2012-6-20
收藏
得分:0 
循环调用过程,会导致这个问题,系统分配的栈堆好像是1M还是2M,一直调用会导致栈堆溢出(参数Push进去不来,一下子就会占满1M 2M内存),随意会导致战队溢出
2013-03-25 20:54
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4938
专家分:30047
注 册:2008-10-15
收藏
得分:20 
VB 不能直接支持 通过 函数指针 调用函数。
所以,不使用API 函数的情况下,函数不能当作形参 去调用。

如果实在是几个函数之间的选择,那你把这个几函数用
select case 来选择调用吧。传递一个 整数数据进去。

------------------------------------------------------------
如果 FOUNC 是一个类里的一个函数,还可以通过  callname 来调用。

授人于鱼,不如授人于渔
早已停用QQ了
2013-03-26 08:35
快速回复:求助:VB 程序调试出现堆栈空间溢出
数据加载中...
 
   



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

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