开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 870|回复: 59
收起左侧

[大家谈谈] 自定义数据类型排序 存不存在这种操作???

[复制链接]
结帖率:100% (2/2)
发表于 2024-7-7 07:19:50 | 显示全部楼层 |阅读模式   贵州省毕节市
又想简单 又想快 还想通用 想啊想 就是想不通真是伤脑筋目前市面上的通用排序 引用起来都不是那么顺手 想发挥想象力 重新设计一个更完美的这种有没有可能实现啊 能力有限 一筹莫展

  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
学生学生100 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
学生 [1].姓名 = “张三”
学生 [1].身高 = 168
学生 [1].体重 = 888
' 省略......
最理想的排序俺认为是这个样子 (学生, 2)  ' 根据身高排序
最理想的排序俺认为是这个样子 (学生, 3)  ' 根据体重排序
子程序名返回值类型公开备 注
最理想的排序俺认为是这个样子  
参数名类 型参考可空数组备 注
通用类型通用型
成员编号整数型

  
数据类型名公开备 注
学生 
成员名类 型传址数组备 注
姓名文本型  
身高小数型  
体重小数型  


点评

大佬们发的我看得很迷糊   福建省泉州市  发表于 2024-7-7 16:36
结帖率:70% (14/20)

签到天数: 22 天

发表于 2024-7-7 09:30:46 | 显示全部楼层   河南省郑州市
PixPin_2024-07-07_09-30-00.png
存取列表啊

点评

这是数组排序,json只是输出而已   河南省郑州市  发表于 2024-7-7 09:42
困了 先睡觉觉,,,   贵州省毕节市  发表于 2024-7-7 09:37
这是JSON排序...要把自定义类型转换成JSON才行   贵州省毕节市  发表于 2024-7-7 09:36
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)

签到天数: 2 天

发表于 2024-7-7 15:12:42 | 显示全部楼层   广东省佛山市
本帖最后由 7ian 于 2024-7-7 15:38 编辑

当然有,懒得分享而已:
https://www.runoob.com/cprogramming/c-function-qsort.html
11.png
1.png


多加几个
2.png

222.png
4.png
4.png

写法:
3.png




点评

看第13楼 自动计算偏移量的问题搞定了 不用手动计算要排序的数据偏移多少 新的问题又来了 传址和传值不能两全   贵州省毕节市  发表于 2024-7-7 18:31
现在,你只需要填上你的数组变量,计算下要排序第几个位置就行了,一个子程序就够了,不用像别的那些,每个自定义结构又重写一遍   广东省佛山市  发表于 2024-7-7 16:35
别想那些了,能通用型支持所有自定义结构 给你填第几个位置已经很不错了,还自动识别类型,单单通用型用易语言你都找不到一个完美的识别类型   广东省佛山市  发表于 2024-7-7 16:33
还差最后一个问题了 可以不用人填 就自动判断出 每一个成员占的空间大小 就可以捣鼓出一个更智能的   贵州省毕节市  发表于 2024-7-7 16:30
第二个参数 直接传入 第一个数组对应的成员 比如 数组[1].B 位置就不用自己填了吧?类型应该也是可以判断出来的   贵州省毕节市  发表于 2024-7-7 16:29
排序成员位置这里 还能再琢磨琢磨 比如 传入 通用型 数组[1].C 是不是就可以达到自动判断位置和类型呢   贵州省毕节市  发表于 2024-7-7 16:28
计算你要排序的位置,前面每出现 长整数型/时间日期/双精度 都算2个位置,其它类型都算4   广东省佛山市  发表于 2024-7-7 15:53
第一段置入代码看的懂 把地址写到[EBP-4]成员数写到[EBP-8] 排序啥的都不是问题现在就是不知道咋自动判断类型比如偏移8的地方可以是小数也可以是整数   贵州省毕节市  发表于 2024-7-7 15:47
全部按整数的精度进行排序?   贵州省毕节市  发表于 2024-7-7 15:44
看懂汇编的话,我里面用的是到整数的计算方法,所以小数型 双精度 长整数都没扩展,原理就是这样   广东省佛山市  发表于 2024-7-7 15:33
还是看不懂 填了位置之后 怎么判断是整数还是双精度 整数读入4字 双精度读入8字...   贵州省毕节市  发表于 2024-7-7 15:30
哇哦 已经有人捣鼓出来了...   贵州省毕节市  发表于 2024-7-7 15:17
回复 支持 反对

使用道具 举报

结帖率:100% (18/18)

签到天数: 25 天

发表于 2024-7-7 16:11:02 | 显示全部楼层   广东省惠州市
用c++自带的排序呗,算法都不用你来写.你只用子程序判断两叁数大小即可!!不过,转为易的子程序可能会变慢了!!
参考
https://bbs.125.la/forum.php?mod ... 14823793&extra=

点评

目前还差最后一个问题了 怎么样判断出 某个自定义类型 占的总大小 吃烤土豆去 回头继续琢磨   贵州省毕节市  发表于 2024-7-7 16:34
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

 楼主| 发表于 2024-7-7 18:10:09 | 显示全部楼层   贵州省毕节市
7ian 发表于 2024-7-7 15:12
当然有,懒得分享而已:
https://www.runoob.com/cprogramming/c-function-qsort.html

测试出来了 这样写 就可以自动判断偏移数据了不用手动计算要偏移多少 直接填第一个数组要排序的成员就可以了 等下把这部分敲成汇编 易语言自带的命令取不了通用型的
调试输出 (取变量数据地址 (测试 [1].三) - 指针到整数 (取变量数据地址 (测试)))
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

 楼主| 发表于 2024-7-7 18:28:37 | 显示全部楼层   贵州省毕节市
7ian 发表于 2024-7-7 15:12
当然有,懒得分享而已:
https://www.runoob.com/cprogramming/c-function-qsort.html

自动计算偏移量 搞定了 你的算法可以再改改 变得更智能 直接填要排序的自定义数据类型成员名 要偏移多少 自动计算 不用手动算了再填
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
三年二班学生10 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
通用排序自动计算偏移量 (三年二班, 三年二班 [1].身高)
通用排序自动计算偏移量 (三年二班, 三年二班 [1].体重)
子程序名返回值类型公开备 注
通用排序自动计算偏移量  
参数名类 型参考可空数组备 注
待排数组通用型8
数据成员通用型12
变量名类 型静态数组备 注
偏移整数型 
' __asm{
' mov eax,[ebp+8]
' mov eax,[eax]
' add eax,8
' mov eAx,[eax]
' mov ebx,[ebp+12]
' SUB ebx,eax
' mov [ebp-4],ebx
' }
调试输出 (偏移)


i支持库列表   支持库注释   
spec特殊功能支持库
  
数据类型名公开备 注
学生 
成员名类 型传址数组备 注
姓名文本型  
身高整数型  
体重小数型  


通用排序测试.e

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

点评

解决一个旧问题 就产生一个新问题 真让猪头大   贵州省毕节市  发表于 2024-7-7 19:11
第二个参数 传值 可以判断要排序的数据是整数小数还是双精度 可惜传值就不能计算偏移量了 勾选参考 传址 又不能判断要排序的数据是什么类型   贵州省毕节市  发表于 2024-7-7 18:32
回复 支持 反对

使用道具 举报

结帖率:83% (39/47)

签到天数: 24 天

发表于 2024-7-7 18:49:38 | 显示全部楼层   福建省宁德市

点评

第二个参数 已经找到优化方向了 看第13楼 可以直接填要排序的数据成员名 自动算出偏移量   贵州省毕节市  发表于 2024-7-7 18:55
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

 楼主| 发表于 2024-7-7 23:58:24 | 显示全部楼层   贵州省毕节市
7ian 发表于 2024-7-7 23:24
原来我以前发过,不知道怎么写的了,自定义数据类型排序  https://bbs.125.la/forum.php?mod=viewthread&ti ...

这样安排 第二个参数和第三个参数 用户填的时候没注意 没有填成相同的 就出错了 能用 不完美
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
三年二班学生10 
猪圈大肥猪5 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
通用排序 (三年二班, 三年二班 [1].身高, 取运行时数据类型 (三年二班 [1].身高), )
通用排序 (猪圈, 猪圈 [1].体重, 取运行时数据类型 (猪圈 [1].体重), )
子程序名返回值类型公开备 注
通用排序逻辑型 通用排序 ( 变量名 , 变量名[1].成员名 , 取运行时数据类型( 变量名[1].成员名 ) , 真 / 假 )
参数名类 型参考可空数组备 注
待排数组通用型自定义数据类型 [ 数组 ]
数据成员通用型变量名[1].成员名 [ 整数 小数 双精度 ]
数据类型整数型取运行时数据类型 ( 变量名[1].成员名 )
真升假降逻辑型真 = 升序 (从小到大) 假 = 降序 (从大到小)
' 排
' 序
' 具
' 体
' 过
' 程
返回 ()  ' 类型支持则进行排序 返回() 不支持则不排序 返回()

  
数据类型名公开备 注
学生 
成员名类 型传址数组备 注
姓名文本型  
身高整数型  
体重小数型  
数据类型名公开备 注
大肥猪 
成员名类 型传址数组备 注
腰围小数型  
体重小数型  
身高小数型  


点评

除了 逻辑型 字节集 子程序指针 别的类型都可以被排序 大工程 要求 简洁 优雅 通用 高效 = 累趴   贵州省毕节市  发表于 2024-7-8 01:10
难点不是取什么类型,是长整数 文本 双精度这些类型的汇编计算   广东省佛山市  发表于 2024-7-8 01:00
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)

签到天数: 2 天

发表于 2024-7-7 23:24:27 | 显示全部楼层   广东省佛山市
原来我以前发过,不知道怎么写的了,自定义数据类型排序  https://bbs.125.la/forum.php?mod=viewthread&tid=14067828 (出处: 精易论坛)

点评

大体的模版差不多思考清楚了 接下来就是具体的排序过程咯   贵州省毕节市  发表于 2024-7-7 23:59
身高体重 自动选的没注意 这里填反了哈   贵州省毕节市  发表于 2024-7-7 23:48
数据类型的问题也以一种不太优雅的方式解决了 通用排序 (三年二班, 三年二班 [1].身高, 取运行时数据类型 (三年二班 [1].体重), 真)   贵州省毕节市  发表于 2024-7-7 23:47
回复 支持 反对

使用道具 举报

结帖率:90% (9/10)

签到天数: 25 天

发表于 2024-7-7 20:33:02 | 显示全部楼层   重庆市重庆市
可惜不能这样用 112.jpg

不然就可以这样 1.jpg

点评

只要思想不滑坡 QwQ 困难总比办法多   贵州省毕节市  发表于 2024-7-7 20:38
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)

签到天数: 2 天

发表于 2024-7-7 19:14:09 | 显示全部楼层   广东省佛山市
本帖最后由 7ian 于 2024-7-7 19:21 编辑
笨来无一悟 发表于 2024-7-7 18:28
自动计算偏移量 搞定了 你的算法可以再改改 变得更智能 直接填要排序的自定义数据类型成员名 要偏移多少  ...

这想法不错,传入地址是可以计算
QQ截图20240707191638.png


QQ截图20240707163608.png

点评

不搞了,顶多再搞 文本型,然后字节集型长度,然后8字节集 这3种类型的子程序   广东省佛山市  发表于 2024-7-7 19:55
再捣鼓捣鼓 看看能不能 既能判断成员偏移 又能判断成员类型   贵州省毕节市  发表于 2024-7-7 19:46
整数 小数 一次读入4字 双精度一次读入8字 MOV MOVSS MOVSD 不判断类型就做不到通用 绝大部分排序场景都是 整 小 双 小部分是时间和文本   贵州省毕节市  发表于 2024-7-7 19:43
不支持 长整数/双精度/日期时间类型的变量;如果长整数型,只判断低4字节,如果高4字节一样或者没超过32位的也可以判断   广东省佛山市  发表于 2024-7-7 19:35
考虑类型做什么,只要排序的不是那3个类型都没问题啊   广东省佛山市  发表于 2024-7-7 19:22
解决一个旧问题 又产生了一个新问题 就是怎么样自动判断这个成员是什么类型 不勾参考可以判断类型 勾了参考可以判断偏移 如何两全其美   贵州省毕节市  发表于 2024-7-7 19:20
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

 楼主| 发表于 2024-7-7 16:38:24 | 显示全部楼层   贵州省毕节市
7ian 发表于 2024-7-7 15:12
当然有,懒得分享而已:
https://www.runoob.com/cprogramming/c-function-qsort.html

感觉你这个还能优化成这样子的 拿 第二个参数的地址减去数组的地址应该就能得出偏移的数值 就不用手动计算数值了 直接填 数组[1].要排序的成员
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
测试测试10 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
通用排序 (测试, 测试 [1].三)
子程序名返回值类型公开备 注
通用排序  
参数名类 型参考可空数组备 注
测试参数通用型
排序成员通用型

  
数据类型名公开备 注
测试 
成员名类 型传址数组备 注
字节型  
整数型  
双精度小数型  
小数型  


点评

知足吧,能更方便的谁不想要,看看你的帖子问的是什么,刚好跟我写的一样   广东省佛山市  发表于 2024-7-7 17:04
要是能实现直接填要排的成员 自动计算偏移和类型 就嘎嘎爽了...   贵州省毕节市  发表于 2024-7-7 16:55
在你填类型.成员 的时候就一定确定了,这里没有存在他在第几个类型位置信息,别幻想偷懒,给你填第几个序号已经很不错了,看看微软提供的api说明   广东省佛山市  发表于 2024-7-7 16:41
幻想,你填的第几个值,最多能检测出类型,就好比我从钱包抽一张钱给你,你能知道是第几张?   广东省佛山市  发表于 2024-7-7 16:40
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)

签到天数: 2 天

发表于 2024-7-7 16:37:31 | 显示全部楼层   广东省佛山市
取自定义类型大小也有,但是用我那个写法根本用不上他也是通用型
QQ截图20240707163608.png

回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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