| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1752 人关注过本帖
标题:求助!!请问对一维数组排序报溢出堆栈空间错误怎么修改?
取消只看楼主 加入收藏
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
结帖率:70%
收藏
已结贴  问题点数:20 回复次数:7 
求助!!请问对一维数组排序报溢出堆栈空间错误怎么修改?
我想对数组内的数据按大小进行排序,大约20万条,用了两种方法,都会报:“实时错误 28  ,溢出堆栈空间”错误,我不断减少数据数量,15万条,10万条,5万条,大约在5万条左右就可以正常排序,请问,如何对程序修改,才能使其在20万条左右不会发生错误?

排序方法1(这个排序速度较快):

程序代码:
Private Sub Command1_Click()
    Call qsort(sj, 1, max_num) '对数组使用二分法
End Sub

Sub qsort(px() As Double, ByVal kaishi As Long, ByVal jieshu As Long)
    Dim temp As Double, j As Long, i As Long
    i = kaishi: j = jieshu '将i、j作为指针,从两侧向中部移动
    If kaishi < jieshu Then '控制是否进入循环
        temp = px(kaishi) '将数组第一个值赋给temp,暂时充当对比量
        While i < j
            Do While i < j '指针j从右向左移动,当遇到比temp小的数时,将该值移动到指针i的位置,并使i向右移动一位
                If px(j) <= temp Then px(i) = px(j): i = i + 1: Exit Do
                j = j - 1
            Loop
            Do While i < j '指针i从左向右移动,当遇到比temp大的数时,将该值移动到指针j的位置,并使j向左移动一位
                If px(i) > temp Then px(j) = px(i): j = j - 1: Exit Do
                i = i + 1
            Loop
        Wend
        px(i) = temp
        Call qsort(px(), kaishi, i - 1) '递归二分法过程进行排序
        Call qsort(px(), i + 1, jieshu)
    Else
        Exit Sub
    End If
End Sub



第二种方法(排序速度较慢):

程序代码:
Private Sub Command1_Click()
            l = max_num: S = 1: ReDim Num(l)
        For px_i = S To l
            Num(px_i) = sj(px_i)
        Next px_i
        Call QUICK_SORT(S, l, Num)
End Sub

'快速排序程序===========================================
Private Sub Exchange(ByRef n1 As Double, ByRef n2 As Double)
    Dim t As Double
    t = n1: n1 = n2: n2 = t
End Sub
Private Function PARTITION(ByVal p As Long, ByVal r As Long, ByRef a() As Double) As Long
    Dim X As Double, t As Long, i As Long, j As Long
    Randomize
    t = CLng((r - p) * Rnd + p)
    Call Exchange(a(r), a(t))
    X = a(r): i = p - 1
    For j = p To r - 1
        If a(j) <= X Then i = i + 1: Call Exchange(a(i), a(j))
    Next j
    Call Exchange(a(i + 1), a(r))
    PARTITION = i + 1
End Function
Private Sub QUICK_SORT(ByVal p As Long, ByVal r As Long, ByRef a() As Double)
    If p < r Then
        Dim q As Long
        q = PARTITION(p, r, a)
        Call QUICK_SORT(p, q - 1, a)
        Call QUICK_SORT(q + 1, r, a)
    End If
End Sub


请版主大人和过往高手大人不吝赐教!感谢!
搜索更多相关主题的帖子: Call Long Sub End 排序 
2023-02-18 21:39
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
回复 2楼 冬瓜汤
大神,您的源码我无法使用,标红。如下图:
图片附件: 游客没有浏览图片的权限,请 登录注册

我查了一下,cdecl库是c函数库,vb6要使用的话,需要打cdecl补丁,我也下载了,如下:
VBCDeclFix.rar (1019.76 KB)

但这个补丁我不会打,请教如何打这个补丁?
2023-02-19 08:22
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
麻烦提供一下实例或者在我提供的源码里修改,两个排序方法也是根据在网上找到的实例修改的,我对数组排序不是很会😓
2023-02-19 09:49
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
回复 6楼 冬瓜汤
真是对不起,您在二楼回复的DLL文件我没有看到,导致我重新在网上寻找,也不知道找到的是什么看不懂的东东,真是对不起!

您提供的DLL文件我已经加载成功,如下图:
图片附件: 游客没有浏览图片的权限,请 登录注册


但是,您提供的源码我怎么也运行不到您回复的结果图片那样的,我试了两种方式,都不行,都报错:
方式1:
方式1.rar (1.56 KB)

结果是:
图片附件: 游客没有浏览图片的权限,请 登录注册



方式2:
方式2.rar (1.36 KB)

结果是:
图片附件: 游客没有浏览图片的权限,请 登录注册


真是不好意思,还能不吝指教指教吗?谢谢您!
2023-02-19 18:36
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
回复 8楼 冬瓜汤
我加载了啊。
图片附件: 游客没有浏览图片的权限,请 登录注册


您能把您的源码在VB6里做好保存一下发给我试一下吗?

另外,我一直没搞懂您的源码里没有Command1_Click()怎么运行的呢?又不是Private Sub Form_Load()加载窗体后直接运行..........
2023-02-19 20:03
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
回复 10楼 冬瓜汤
前辈您好,我将您的程序带入我的数据中测试,大约近20万数据,的确不溢出了,谢谢!但是有个问题还需要请教:
您的程序针对数据类型为long时,排序是正确的,但如果数据类型是doubles时,排序仅对整数部分有效,对小数部分无效(我把数组、a、b三处的数据类型修改成doubles了),结果如下图:
图片附件: 游客没有浏览图片的权限,请 登录注册


您帮忙看一下,我程序里哪里写错了或者哪里还需要做出修改的,麻烦请告之,谢谢。

附,我将您的程序带入我的数据中测试的源码:
数据测试.rar (3.77 MB)
2023-02-20 23:07
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
回复 10楼 冬瓜汤
前辈您好,我更换了一种排序方式,比您的方法速度慢了一些,但大约20万的数据也不会报溢出了,Double数据格式排序顺序也是正确了,现向您汇报一下,谢谢您的孜孜不倦的教导,让我对VB的编程技巧有了更深入的了解,谢谢您。
附,修改过的程序。
数据测试-2.rar (3.77 MB)

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2023-2-21 10:25编辑过]

2023-02-21 10:23
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
回复 13楼 冬瓜汤
前辈您好,还有一个问题想请教一下:
您可以看到我提供的数据CSV里有很多参数,除去b(19)列外,我还需要对我还要分别对b(18)列,b(22)列,b(15)列,b(13)列,b(11)列分别读到数组a2_sj、a3_sj、a4_sj、a5_sj、a6_sj里,然后排序,然后输出到各个不同的文件里,重复调用语句:
qsort a1_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a2_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a3_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a4_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a5_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a6_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

发现排序越来越慢,然后会报错,这种情况怎么解决?

附:新修改的程序。
数据测试-3.rar (3.77 MB)
2023-02-21 17:01
快速回复:求助!!请问对一维数组排序报溢出堆栈空间错误怎么修改?
数据加载中...
 
   



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

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