vb堆栈空间溢出

qq_38151060 2017-04-17 03:48:20
 Function DZEBJZf(x)
Dim b1, b2, b3, b4, bj1 As Double
b1 = 1.71
b2 = 1.56
bj1 = 1.56
If b2 < bj1 < b1 Then

DZEBJZf(x) = DZEBJZ1f(x) + (bj1 - b1) * (DZEBJZ2f(x) - DZEBJZ1f(x)) / (b2 - b1)


End If
End Function

其中 DZEBJZ1f(x), DZEBJZ2f(x)都已经定义过了,且没有错误。在运行程序的时候在这段语句发生 DZEBJZf(x) = DZEBJZ1f(x) + (bj1 - b1) * (DZEBJZ2f(x) - DZEBJZ1f(x)) / (b2 - b1)堆栈空间溢出错误,这是为什么该怎么改,求指导!
...全文
1779 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
海鸥软件 2018-03-08
  • 打赏
  • 举报
回复
你递归调用判断的条件不明确,一旦进入递归,就一直调用下去,没有出口,当然溢出啦。做递归你首先要明确 出口条件是会成立的( If b2 < bj1 < b1 Then)也就是说它是否有不成立的时候?你这个递归对三个变量一直没有操作,也就是三个值一直不变,条件要不永远成立,要不永远不成立,所有程序要不执行永远不停,要不不执行。
xzjxucxx 2018-01-22
  • 打赏
  • 举报
回复
先学会基本的语法再说
greatbody 2017-12-17
  • 打赏
  • 举报
回复
引用 11 楼 Chen8013 的回复:
BS楼上两个挖坟的…………
同鄙视。
舉杯邀明月 2017-12-15
  • 打赏
  • 举报
回复
BS楼上两个挖坟的…………
赵4老师 2017-12-15
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
熊孩子开学喽 2017-12-14
  • 打赏
  • 举报
回复
一般而言, 递归或者循环调用出问题都是不满足退出条件.
脆皮大雪糕 2017-05-18
  • 打赏
  • 举报
回复
问题的问法不对,直接问你想要的目标是什么,比如:什么样的输入,想得到什么样的输出,想用递归实现怎么做。 不要把你写一半已经进死胡同的代码拿出来让别人帮你改
X-i-n 2017-05-18
  • 打赏
  • 举报
回复
一个函数,必须在所有分支上都能返回结果
if xxx then
'返回结果
else
'这里也要返回结果
end if
X-i-n 2017-05-18
  • 打赏
  • 举报
回复
DZEBJZf(x) 是一个函数表达式,它是用来返回结果的,只能作为值去赋给变量,而不可以为函数表达式赋值。 a(x)是数组元素的时候才能出现在等号左边
X-i-n 2017-05-18
  • 打赏
  • 举报
回复
为什么会有 a<b<c这种写法? 你要判断三个数的关系,必须用 a<b and b<c 写成a<b<c以后,运算流程会变成 (a<b) < c 也就是一个Boolean 值<c 也就是根据a<b的结果,得到 True或者False,再跟 c 比较大小( True/False < c ) vb里,true=-1,false=0 所以最终判断条件会变成 -1 < c 或者 0 < c
熊孩子开学喽 2017-05-18
  • 打赏
  • 举报
回复
b1 = 1.71 b2 = 1.56 bj1 = 1.56 If b2 < bj1 < b1 Then 这三个数是不变的, 那怎么退出递归?
chuifengde 2017-04-18
  • 打赏
  • 举报
回复
函数的返回值用下面的形式
DZEBJZf = DZEBJZ1f(x) + (bj1 - b1) * (DZEBJZ2f(x) - DZEBJZ1f(x)) / (b2 - b1)
舉杯邀明月 2017-04-17
  • 打赏
  • 举报
回复
逻辑问题,自己的“思路”肯定是错的! 你这样的代码,没有出现“堆栈溢出”,那才是怪事! 当你这个“函数”被调用时: 因为语句“If b2 < bj1 < b1 Then”中的“逻辑表达式”始终为 True的,因此就会出现“函数的递归调用”; 因为“递归结束”的条件,跟传入的参数无关,无论参数是多少,都是“会触发递归调用”的,   换句话说:这个函数只要被调用,就会造成“无穷递归”的调用,岂有不出现“堆栈溢出”的道理!!!
赵4老师 2017-04-17
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
此代码是《VB真是想不到系列之三:VB指针葵花宝典之函数指针》的配套代码。 本系列文章可见: http://www.csdn.net/develop/list_article.asp?author=AdamBear 本代码主要是用来谈函数指针在VB内部的应用之一,给出了qsort和ShellSort的实现。其中ShellSort完全是取自1998年5月VBPJ的Black Belt专栏里的源代码,可以说本文的思想基本上也来自这篇专栏文章。 ShellSort提共了三种不同的实现方法,分别是如下: PolySort1: 用Variant和对象缺省属性来比较。 PolySort2:用ISortable接口的多态对象技术来实现 PolySort3:用函数指针强制回调技术来实现。 分别运行一下这三个程序,可以发现用函数指针是最快的。值得一提作者的钻研精神,完全在VB里实现同一种算法完全三种不同的实现,而且一个比一个好,我非常佩服。 我原以为qsort应该会比它快不少,从算法上来说是这样,不过做出来才发现,要在VB里做出比它快的qsort很难,即使经过了仔细的优化。这是因为qsort的实现上比shellsort复杂,在C里多几次比较、多几次无用的移动影响不大,但在VB里多用一次API回调的Compare、多用一次CopyMemory都是很大的开销。而且qsort要嵌套调用(不嵌套在VB里也慢),我们还要尽量节约堆栈,虽然1M的默认堆栈大小可以被扩充(有相邻的空闲空间时),但是我们依然要考虑可能存在的溢出,所以我做的qsort仅两个参数,两个局部Long型变量。大家可以参考一下我最终的qsort的源代码。 见QSort工程里的basQSort模块,有详细注释。 虽然qsort还是比shellsort慢得多,但是可以说qsort已经进行了较好的优化。可见在VB里一个算法好不好,不能仅仅从理论上看,一个差一点但实现简单的算法和一个好一点但实现上复杂的算法在VB里谁好谁坏很难说。所以从实践意义上,ShellSort的确是个不错的算法。 无论ShellSort还是qsort,它们都还可以更加快,我在文章里说过,那必须要Hack一下SafeArray。 本系列第四篇文章《VB真是想不到系列之三:VB指针葵花宝典之数组指针》里再谈,这篇文章很快就会出来。

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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