问题
函数文档地址:qsort\_s | Microsoft Learn
看微软的文档,qsort_s()函数中的 compar 参数是 __cdecl 模式 ,直接传递子程序指针会异常崩溃,回调几次就蹦了
对于回调函数是 __cdecl 模式的情况应该如何填写回调地址呢
解决
局_cdecl = S3_ToCdecl (&_数组_排序过程, 3)
.版本 2
.子程序 S3_ToCdecl, 整数型, , 将易语言的子程序指针,转换为 _cdecl 函数指针,在不使用时需要调用 S3_FreeCdecl() 释放内存
.参数 lpfunction, 子程序指针, , 子程序指针
.参数 param_nums, 整数型, , 参数个数
.局部变量 i, 整数型
.局部变量 lp, 整数型
.局部变量 offset, 整数型
.局部变量 asm, 字节集
lp = VirtualAlloc (0, 12 + 6 × param_nums, 位或 (#MEM_COMMIT, #MEM_RESERVE), #PAGE_EXECUTE_READWRITE)
asm = { 85, 139, 236 } ' push ebp ; mov ebp,esp
RtlMoveMemory (lp, _取指针字节集 (asm), 3)
offset = offset + 3
asm = { 184 } + 到字节集 (到整数 (lpfunction)) ' mov eax,lpfunction
RtlMoveMemory (lp + offset, _取指针字节集 (asm), 5)
offset = offset + 5
' 本源码来自易语言资源网(www.5A5X.com)
.计次循环首 (param_nums, i)
asm = { 255, 181 }
RtlMoveMemory (lp + offset, _取指针字节集 (asm), 2)
offset = offset + 2
asm = 到字节集 (到整数 (4 × (param_nums - (i - 1)) + 4)) ' push [ebp+4+(count-(i-1))*4]
RtlMoveMemory (lp + offset, _取指针字节集 (asm), 4)
offset = offset + 4
.计次循环尾 ()
asm = { 255, 208, 93, 195 } ' call eax ; pop ebp; ret
RtlMoveMemory (lp + offset, _取指针字节集 (asm), 4)
返回 (lp)
源文件