纯VB6调用qsort进行数组排序
vb吧
全部回复
仅看楼主
level 12
这个帖子不讨论排序方法和速度,主要是介绍一下VB6调用cdecl约定的函数和封装回调的方法
全部代码
由大到小
模块
2022年09月24日 20点09分 1
level 14
顶一下。好久没写代码,都有点看不懂了[酸爽]
2022年09月24日 22点09分 2
有可能写的太乱
2022年09月25日 03点09分
level 10
程序员半夜写代码
2022年09月24日 23点09分 3
代码写的乱七八糟怎么会是程序员,就一个晚上睡不着的人
2022年09月25日 03点09分
level 9
太牛了!
2022年09月28日 06点09分 4
level 8
🔝顶
2022年09月28日 14点09分 5
level 14
VB6是有CDecl关键字的,只是很多人不知道而已:
Declare Sub qsort CDecl Lib "ntdll"(Base As Any, ByVal NumOfElements As Long, ByVal SizeOfElements As Long, ByVal CompareFunction As Long)
但是由于巨硬当年写了个BUG,导致Declare声明的CDecl函数没法正确调用(只有tlb声明的可以),于是国外就有位大婶给VB6写了个插件修复了此BUG:https://github.com/woeoio/VBCDeclFix
装这个补丁插件并启用后,不仅CDecl声明的函数可以正常调用了,连回调函数我们也直接写上 CDecl 调用约定:
Function CompInt CDecl(ByRef a As Integer, ByRef b As Integer) As Long
CompInt = a - b
End Function
2022年09月29日 04点09分 6
回楼主,我看到你回帖说“而且我这人有个坏习惯,写出来的代码尽可能能在最精简的VB6自版本中编译,而不是想办法装什么库,什么插件”,这里没有显示可能被吞了吧。CDeclFix是修改VB6编译器BUG,用它编译出来的exe是不需要带任何库就可以发布的。
2022年09月30日 00点09分
回楼主,我看到你回帖说“而且我这人有个坏习惯,写出来的代码尽可能能在最精简的VB6自版本中编译,而不是想办法装什么库,什么插件”,这里没有显示可能被吞了吧。CDeclFix是修改VB6编译器BUG,用它编译出来的exe是不需要带任何库就可以发布的。
2022年09月30日 00点09分
@yjryym 就算这个插件能修复cdecl关键字的bug,但是也没在任何版本vb6中自带,也就只能当它不存在用现有条件解决问题。如果调用的函数不是cdecl而是fastcall戓者register,我的思路写能正常写出能用的代码,这插件还能用么?
2022年09月30日 04点09分
level 14
这里我再重点提示一下,排序回调函数里面的ByVal和内存拷贝都是多此一举的操作,并且非常影响排序效率。
你要排序的数组的成员是什么类型,你就直接用什么类型参数(注意要用 ByRef 参数)就可以了,因为qsort函数是传的数组成员的地址,VB6的ByRef在底层实现就是地址,所以你直接用ByRef就能接收任何类型的数据,且不会产生拷贝副本。
2022年09月29日 04点09分 7
这个早就发现了,byref 不用拷贝内存回调速度可以提高一倍,这里只是提供一种另类方法,也别太在意细节,真要说极限速度就直接抄汇编改stdcall了
2022年09月29日 07点09分
@👨🏿‍🦱 而且我这人有个坏习惯,写出来的代码尽可能能在最精简的VB6自版本中编译,而不是想办法装什么库,什么插件
2022年09月29日 08点09分
@👨🏿‍🦱 来回Copy也不仅仅只是效率问题,易用性也会大大下降嘛(特别是新手看了你的帖子,很容易抄错内存拷贝的操作)[滑稽]
2022年09月30日 00点09分
@👨🏿‍🦱 来回Copy也不仅仅只是效率问题,易用性也会大大下降嘛(特别是新手看了你的帖子,很容易抄错内存拷贝的操作)[滑稽]
2022年09月30日 00点09分
1