开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2264|回复: 24
收起左侧

[易语言纯源码] 自定义数据类型 【通用排序】 多条件版

[复制链接]
结帖率:100% (2/2)
发表于 2024-7-22 16:42:50 | 显示全部楼层 |阅读模式   贵州省毕节市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
本帖最后由 笨来无一悟 于 2024-7-23 07:14 编辑

名曰:多条件 实际只按某一个条件排序也是可以的

自行设计 &比较函数 什么条件返回0 什么条件返回1 什么条件返回-1 达到升序或者降序的效果

很简单的 参考示例几分钟就上手了

模块源码 ↓
  
子程序名返回值类型公开备 注
多项排序 【自定义 数据类型 多条件排序】请严格遵循 示例规范
参数名类 型参考可空数组备 注
待排数组通用型任意类型 与 比较回调 的 两个参数 需保持一致
比较回调子程序指针参数一:具体类型 参数二:具体类型 返回值 整数型 : 零 \ 正 \ 负
变量名类 型静态数组备 注
数组地址整数型指针到整数 (取变量地址 (待排数组)) + 8
成员数量整数型指针到整数 (指针到整数 (取变量地址 (待排数组)) + 4)
跳转地址整数型 
跳转函数字节集跳到具体比较过程 脱离汇编 让易语言语法引用@qsort时也能直接进行大小比较
数组地址 = 0
成员数量 = 0
跳转地址 = 0
跳转函数 = { 85, 137, 229, 83, 255, 117, 8, 255, 117, 12, 255, 21 }到字节集 (取变量数据地址 (跳转地址)) + { 91, 201, 195 }
置入代码 ({ 83, 81, 139, 69, 12, 64, 139, 8, 128, 249, 232, 117, 248, 139, 72, 1, 141, 92, 8, 5, 139, 11, 193, 225, 8, 129, 249, 0, 85, 139, 236, 141, 64, 4, 117, 225, 137, 216, 89, 91, 137, 69, 244 })
置入代码 ({ 54, 139, 69, 8, 62, 139, 0, 131, 192, 8, 54, 137, 69, 252, 62, 139, 64, 252, 54, 137, 69, 248 })
qsort (数组地址, 成员数量, 4, 取变量数据地址 (跳转函数))


i支持库列表   支持库注释   
spec特殊功能支持库

  
DLL命令名返回值类型公开备 注
qsort整数型 快速排序   msvcrt.dll   与   ntdll.dll  皆可
DLL库文件名:
ntdll.dll
在DLL库中对应命令名:
@qsort
参数名类 型传址数组备 注
起始地址整数型待排序数组首地址 通用型 + 8
数组数量整数型数组中待排序元素数量 通用型 + 4
元素尺寸整数型sizeof(s)一般为4  各元素的占用空间大小
比较函数整数型指向比较函数的指针,用于确定排序的顺序


示例源码 ↓
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
猪圈大肥猪20 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
计次整数型 
排序前.行数 = 取数组成员数 (猪圈) + 1
排序后.行数 = 取数组成员数 (猪圈) + 1
排序前.置数据 (计次, 0, 1, “姓名”)
排序前.置数据 (计次, 1, 1, “身高”)
排序前.置数据 (计次, 2, 1, “体重”)
排序后.置数据 (计次, 0, 1, “姓名”)
排序后.置数据 (计次, 1, 1, “身高”)
排序后.置数据 (计次, 2, 1, “体重”)
计次循环首 (取数组成员数 (猪圈), 计次)
猪圈 [计次].身高 = 取随机数 (0, 9)
猪圈 [计次].体重 = 取随机数 (0, 99) ÷ 10
猪圈 [计次].姓名 = 选择 (取随机数 (0, 1) = 1, “大”, “小”)文本_取随机汉字 (2, 0)“猪”
排序前.置数据 (计次, 0, 1, 猪圈 [计次].姓名)
排序前.置数据 (计次, 1, 1, 猪圈 [计次].身高)
排序前.置数据 (计次, 2, 1, 猪圈 [计次].体重)
计次循环尾 ()
多项排序 (猪圈, &比较)
计次循环首 (取数组成员数 (猪圈), 计次)
排序后.置数据 (计次, 0, 1, 猪圈 [计次].姓名)
排序后.置数据 (计次, 1, 1, 猪圈 [计次].身高)
排序后.置数据 (计次, 2, 1, 猪圈 [计次].体重)
计次循环尾 ()
子程序名返回值类型公开备 注
比较整数型 自行设计大于小于等于分别返回什么
参数名类 型参考可空数组备 注
大肥猪
大肥猪
判断 (一.身高 > 二.身高)  ' 大于
返回 (1)
判断 (一.身高 < 二.身高)  ' 小于
返回 (-1)
判断 (一.体重 > 二.体重)  ' 身高 不大于也不小于 说明相等 那就继续比较 体重
返回 (1)
判断 (一.体重 < 二.体重)
返回 (-1)
返回 (0)  ' 都相等 就 返回(0)
' 这里只拿两个条件举例
子程序名返回值类型公开备 注
文本_取随机汉字文本型 取常用的随机汉字
参数名类 型参考可空数组备 注
个数整数型要取出多少个汉字!
汉字或全拼整数型0为汉字,1为全拼音!
变量名类 型静态数组备 注
计次整数型 
得到的文本文本型 
置随机数种子 ()
计次循环首 (个数, 计次)
如果真 (汉字或全拼 = 0)
得到的文本 = 得到的文本 + 到文本 (字符 (取随机数 (38, 80)) + 字符 (取随机数 (38, 80)))
如果真 (汉字或全拼 = 1)
得到的文本 = 得到的文本 + 取拼音 (到文本 (字符 (取随机数 (38, 80)) + 字符 (取随机数 (38, 80))), 1)
处理事件 ()
计次循环尾 ()
返回 (得到的文本)
子程序名返回值类型公开备 注
_开始排序_被单击  
变量名类 型静态数组备 注
计次整数型 
T整数型 
开始排序.禁止 = 真
重定义数组 (猪圈, 假, 100000)
' 排序前.行数 = 取数组成员数 (猪圈) + 1
' 排序后.行数 = 取数组成员数 (猪圈) + 1
计次循环首 (取数组成员数 (猪圈), 计次)
猪圈 [计次].身高 = 取随机数 (0, 9)
猪圈 [计次].体重 = 取随机数 (0, 99) ÷ 10
猪圈 [计次].姓名 = 选择 (取随机数 (0, 1) = 1, “大”, “小”)文本_取随机汉字 (2, 0)“猪”
' 排序前.置数据 (计次, 0, 1, 猪圈 [计次].姓名)
' 排序前.置数据 (计次, 1, 1, 猪圈 [计次].身高)
' 排序前.置数据 (计次, 2, 1, 猪圈 [计次].体重)
计次循环尾 ()
T = 取启动时间 ()
多项排序 (猪圈, &比较)
调试输出 (“排序十万头猪耗时”, 取启动时间 () - T, “毫秒”)
计次循环首 (取数组成员数 (猪圈), 计次)
' 排序后.置数据 (计次, 0, 1, 猪圈 [计次].姓名)
' 排序后.置数据 (计次, 1, 1, 猪圈 [计次].身高)
' 排序后.置数据 (计次, 2, 1, 猪圈 [计次].体重)
计次循环尾 ()  ' 表格展示数据太慢了 屏蔽之~~~
开始排序.禁止 = 假


i支持库列表   支持库注释   
eGrid高级表格支持库
spec特殊功能支持库
  
数据类型名公开备 注
大肥猪 
成员名类 型传址数组备 注
身高整数型  
体重双精度小数型  
姓名文本型  



如果觉得判断的嵌套不方便查看分支那按下面这种格式书写也可以


  
子程序名返回值类型公开备 注
比较整数型 类型 与 比较成员 自行更改
参数名类 型参考可空数组备 注
A大肥猪
B大肥猪
' 先比较↓
如果真 (A.身高 > B.身高)
返回 (1)
如果真 (A.身高 < B.身高)
返回 (-1)
' 再比较↓
如果真 (A.体重 > B.体重)
返回 (1)
如果真 (A.体重 < B.体重)
返回 (-1)
' 全相等↓
返回 (0)

https://xzt168.lanzouj.com/irFYG259htoh

不想安装汇编插件的可以虚函数套娃的方式引用多条件排序↓ 不过速度会慢两三倍 大规模的数据 或者单一条件 不需要这个方案 优点是方便一点点 缺点是真的慢

  
多项排序 (猪圈, &虚晃一枪)
子程序名返回值类型公开备 注
虚晃一枪 不想安装汇编插件的话 可以拿一个虚函数套一层娃 会牺牲最少两三倍的速度
变量名类 型静态数组备 注
虚晃一枪大肥猪局部变量类型和你要排序的数组类型保持一致 比较函数的两个参数也一样
比较 (虚晃一枪, 虚晃一枪)  ' 拿来骗编译器的~~~
子程序名返回值类型公开备 注
比较整数型 类型 与 比较成员 自行更改
参数名类 型参考可空数组备 注
A大肥猪
B大肥猪
变量名类 型静态数组备 注
释放地址整数型 
置入代码 ({ 139, 69, 8, 139, 0, 137, 69, 252 })
释放内存 (释放地址)  ' 清理 虚假的参数 内存占用 虚函数 局部变量
置入代码 ({ 201 })  ' 骗完编译器再返回前面的堆栈 获取真实的参数
' ↑以上模版不要随意更改 ↓以下比较规则可以随意
' 先比较↓
如果真 (A.身高 > B.身高)
返回 (1)
如果真 (A.身高 < B.身高)
返回 (-1)
' 再比较↓
如果真 (A.体重 > B.体重)
返回 (1)
如果真 (A.体重 < B.体重)
返回 (-1)
' 全相等↓
返回 (0)


i支持库列表   支持库注释   
spec特殊功能支持库

来自群组: 热心网友

自定义数据类型多条件排序.zip

10.04 KB, 下载次数: 7, 下载积分: 精币 -2 枚

虚函数-套娃版.png

点评

写的时候没注意 忘了说 参数传递&子程序指针 带的类型不是基础类型的时候需要 InlineAssembler支持库 下次再优化一个脱离支持库也能运行的~~~   贵州省毕节市  发表于 2024-7-22 21:39

评分

参与人数 3好评 +2 精币 +4 收起 理由
wa690602724 + 1 感谢分享,很给力!~
光影魔术 + 1 + 1 开源精神必须支持~
baitso + 1 + 2 开源精神必须支持~

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (2/2)

签到天数: 12 天

 楼主| 发表于 2024-7-23 00:36:51 | 显示全部楼层   贵州省毕节市
易语言内联汇编器v3.2-更新nasm汇编引擎 伪指令 宏定义
https://bbs.125.la/forum.php?mod=viewthread&tid=14781323
(出处: 精易论坛)
需要多条件排序的小伙陪可以先安装一下这个支持库
没留意子程序参数非基础类型不让取子程序指针
以后再改个不需要支持库的看看能不能成功

点评

成功了 可以脱离汇编插件跑起来了 失败了 速度掉了三倍~~~   贵州省毕节市  发表于 2024-7-23 07:48
回复 支持 1 反对 0

使用道具 举报

结帖率:100% (2/2)

签到天数: 12 天

 楼主| 发表于 2024-7-23 17:47:36 | 显示全部楼层   贵州省毕节市
脱离汇编插件 并且不掉速的版本 引用起来会麻烦一些大佬们跑的太快 蠢新我望尘莫及

多条件排序 再次优化版.e

10.98 KB, 下载次数: 7, 下载积分: 精币 -2 枚

经凌哥指点通过取上层指针的方式取出自定义参数的子程序指针了

回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2024-7-30 02:13:06 | 显示全部楼层   海南省海口市
感谢大神分享~!
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)

签到天数: 2 天

发表于 2024-7-27 19:36:18 | 显示全部楼层   山东省潍坊市
已经顶贴,感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

签到天数: 22 天

发表于 2024-7-25 12:17:58 | 显示全部楼层   云南省昆明市
开源精神必须支持~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 15 天

发表于 2024-7-24 13:26:48 | 显示全部楼层   广西壮族自治区柳州市
感谢分享源码
回复 支持 反对

使用道具 举报

结帖率:100% (7/7)

签到天数: 23 天

发表于 2024-7-23 11:33:47 | 显示全部楼层   湖北省咸宁市
开源精神必须支持~
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)

签到天数: 25 天

发表于 2024-7-23 10:10:44 | 显示全部楼层   广西壮族自治区玉林市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:73% (8/11)

签到天数: 25 天

发表于 2024-7-23 08:56:20 | 显示全部楼层   河南省焦作市
学习一下
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 27 天

发表于 2024-7-23 08:10:51 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表