精易论坛

标题: 新年好 易语言 sizeof 函数实现 [打印本页]

作者: 帅气与大侠    时间: 2023-12-30 21:28
标题: 新年好 易语言 sizeof 函数实现
本帖最后由 帅气与大侠 于 2024-1-1 01:04 编辑

年末了,今年又学习到了不少新知识, 跟大家分享下易语言 sizeof 实现方法。

日常开发中,经常要调用某些 api 函数,拷贝来拷贝去,其中不免会遇到要填写某个数据类型的结构尺寸
看 api 文档别的语言是通过 sizeof(var) 去统计某些结构体的尺寸,但是咱易语言没有。


最早我是拿手指头一个一个数的,经常手指头不够用。
后来学到了用 LocalSize () 函数,将参数类型改为具体的数据类型去计算
每次遇到新数据类型结构就要新定义一个DLL,也很麻烦!
刚好近期消化了不少关于内存的知识,就尝试下看看,调试观察了各种各样的数据类型,大致是了解清楚了存储机制,把 sizeif 的功能搞出来了。
不过有点小瑕疵,就是参数无法弄成通用型的,要额外:取指针地址(变量)传入。
强制取通用型测试会异常,有大佬会弄的可以试试弄成通用型变量。

完整源码下载:
源码预览:
  
窗口程序集名保 留  保 留备 注
程序集1   
子程序名返回值类型公开备 注
_启动子程序整数型 本子程序在程序启动后最先执行
变量名类 型静态数组备 注
IP_ADAPTER_INFOIP_ADAPTER_INFO 
测试数据类型测试数据类型 
多层嵌套数据结构多层嵌套数据结构 
调试输出 (sizeof (取指针地址 (IP_ADAPTER_INFO)))
调试输出 (sizeof (取指针地址 (多层嵌套数据结构)), LocalSize_多层嵌套数据结构 (多层嵌套数据结构))
调试输出 (sizeof (取指针地址 (测试数据类型)))
调试输出 (sizeof ( #字节型 ), sizeof ( #短整数型 ), sizeof ( #整数型 ), sizeof ( #长整数型 ), sizeof ( #小数型 ), sizeof ( #双精度小数型 ), sizeof ( #逻辑型 ), sizeof ( #日期时间型 ), sizeof ( #子程序指针型 ))
返回 (0)  ' 可以根据您的需要返回任意数值
子程序名返回值类型公开备 注
sizeof整数型 取数据结构的大小尺寸,失败返回0
参数名类 型参考可空数组备 注
param整数型取指针地址(数据结构),不支持数组
变量名类 型静态数组备 注
pAddr整数型 
size整数型 
len整数型 
I整数型 
ptr整数型 
如果真 (param > 0 param < 10)
返回 (取数据类型尺寸 (param))

pAddr = param
len = __getPtrLen (pAddr)
变量循环首 (0, len, 4, I)  ' 易语言数据结构是4字节对齐的,每4个字节一组循环
ptr = __get (pAddr, I)  ' 取索引组整数,该整数可能是指针地址,也有可能是纯数值
判断 (指针_是否有效 (ptr))  ' 指针是否有效可以区分一个整数是指针还是数值,分配内存的时候应该什么地方有记录
ptr = __getRedirArrPtr (ptr)  ' 有可能是数组指针,就要进行重定向+8偏移
size = size + sizeof (ptr)  ' 传入新指针地址,递归累计大小
size = size + 4

变量循环尾 ()
' 下面 size - 4 作用解释
' sizeof()时,第一层的指针地址比如是{1,0,0,0,2,0,0,0,3,0,0,0},4字节对齐,表示这个数据结构有N个成员
' 成员的地址指向{1,0,0,0}{2,0,0,0},这一层的大小是不统计进去的
' 只统计最终指向的数据实际长度
' 由于是递归,无论指针地址嵌套多少层,每递归一次就-4就完美了
如果真 (size ≠ 0)
size = size - 4
返回 (size)
子程序名返回值类型公开备 注
__getPtrLen整数型 取指针长度,找到8个连续的171时返回,如不明此函数用途请勿调用,避免异常!!!
参数名类 型参考可空数组备 注
pointer整数型
变量名类 型静态数组备 注
pAddr整数型 
byte字节型 
count整数型 
pAddr = pointer
循环判断首 ()
byte = __get_byte (pAddr, 0)
判断 (byte = 171)
count = count + 1
count = 0

pAddr = pAddr + 1
循环判断尾 (count < 7)
返回 (pAddr - pointer - count + 1)
子程序名返回值类型公开备 注
__getRedirArrPtr整数型 数组指针重定向,如果指针地址指向的是数组起始地址{1,0,0,0,x,x,x,x}则对该指针地址进行+8重定向,否则返回源指针地址。
参数名类 型参考可空数组备 注
pAddr整数型
变量名类 型静态数组备 注
offset整数型 
如果真 (__get_byte (pAddr, 0) = 1)
offset = __get (pAddr, 4)  ' 取数组成员数
如果真 (__get (pAddr + 8, offset) = -1414812757 __get (pAddr + 12, offset) = -1414812757)
' 取成员数量后面是否是8个连续的171,是的话就是数组了,返回+8。
' -1414812757=取字节集数据 ({ 171,171,171,171 }, #整数型, )
返回 (pAddr + 8)

返回 (pAddr)


i支持库列表   支持库注释   
spec特殊功能支持库
shellEx扩展功能支持库一

作者: 447485268    时间: 2023-12-30 23:02
支持开源~!感谢分享
作者: 神祇    时间: 2023-12-30 23:52
不知道是不是我理解错误,易语言的自定义结构多层嵌套的情况下,会出现内存地址不连续的问题.
作者: bianyuan456    时间: 2023-12-31 00:46
已经顶贴,感谢您对论坛的支持!
作者: 帅气与大侠    时间: 2023-12-31 00:54
冬夜静思念 发表于 2023-12-30 23:52
不知道是不是我理解错误,易语言的自定义结构多层嵌套的情况下,会出现内存地址不连续的问题. ...

通过取第一层的结构地址,就可以定位出所有的嵌套了
作者: 查过    时间: 2023-12-31 07:12
感谢分享,很给力!~
作者: 豆豆灰常开心    时间: 2023-12-31 07:17
感谢楼主分享!
作者: 小虎来了    时间: 2023-12-31 09:51
感谢分享,很给力!~
作者: 一指温柔    时间: 2023-12-31 09:54
感谢分享,很给力!~
作者: kantal    时间: 2023-12-31 10:49
感谢分享,很给力!~
作者: year1970    时间: 2023-12-31 11:11
感谢分享,学习了
作者: 396384183    时间: 2023-12-31 19:16
支持开源~!感谢分享
作者: ttggnn    时间: 2023-12-31 20:25
支持开源~!感谢分享
作者: 天使与恶魔    时间: 2023-12-31 20:32
666666666666666666
作者: woaiplz123    时间: 2023-12-31 22:34
支持开源~!感谢分享
作者: 该死dē蚊子    时间: 2024-1-1 00:46
很好,C++的感觉回来了。
作者: 查过    时间: 2024-1-1 07:24
下个学习一下
作者: 豆豆灰常开心    时间: 2024-1-1 07:28
感谢楼主分享!
作者: 不苦小和尚    时间: 2024-1-1 10:57
试试看看,以前都是自己直接写死的
作者: 枫眼    时间: 2024-1-1 14:45
感谢楼主分享
作者: wjswzj0    时间: 2024-1-1 15:21
感谢分享,很给力!~
作者: q277359516    时间: 2024-1-1 19:47
刚好需要
作者: gdhong    时间: 2024-1-1 21:01
谢谢分享!
作者: pipicool    时间: 2024-1-1 23:00
学习一下
作者: jiang910615    时间: 2024-1-2 09:25
学习一下
作者: wlsk888    时间: 2024-1-2 13:30
谢谢分享,学习学习
作者: kyo9766    时间: 2024-1-2 14:39
学习一下sizeof 函数,感谢分享
作者: yujiekuxiao    时间: 2024-1-2 19:17
让 江小白 来看看帖子里藏了啥好东西~~~
作者: 谁的坏叔叔    时间: 2024-1-2 22:00
看看是什么好东西
作者: 网络注册网员    时间: 2024-1-3 09:30
感谢分享
作者: sinewtec    时间: 2024-1-3 10:03
感谢分享,很给力!~
作者: 轻风影    时间: 2024-1-4 21:01
看起来不错
作者: crhxm    时间: 2024-1-6 00:15
  
子程序名返回值类型公开备 注
取数据尺寸整数型 
参数名类 型参考可空数组备 注
通用数据通用型
变量名类 型静态数组备 注
数据指针整数型 
指针数值  
数据指针 = 取通用数据地址 (通用数据)
指针数值 = 指针到整数 (数据指针)
返回 (sizeof (指针数值))
子程序名返回值类型公开备 注
取通用数据地址整数型 相当于 取变量地址()
参数名类 型参考可空数组备 注
参数通用通用型
置入代码 ({ 139, 69, 8, 201, 194, 4, 0 })
返回 (0)

作者: 18583687285    时间: 2024-1-6 12:00
看起来不错
作者: q2we    时间: 2024-1-8 17:15
学习学习!!!
作者: ttjy888    时间: 2024-1-8 17:29

学习学习!!!
作者: 此次里    时间: 2024-1-8 18:09
就看看好
作者: 唯美主义    时间: 2024-1-8 20:48
下载了,look look
作者: 气东来    时间: 2024-1-8 21:11
感谢分享,很给力!~
作者: jiqigouer    时间: 2024-1-9 00:59
谢谢分享
作者: samshine987    时间: 2024-1-9 08:30
非常好用!~~~~~~~~
作者: 1aa82e    时间: 2024-1-9 14:43
学习学习!!!
作者: 易不简单    时间: 2024-1-9 21:47
6666666666666
作者: Ford    时间: 2024-1-9 22:28
6666666666666
6
作者: ♂隐    时间: 2024-1-10 14:20
内存的东西碰的很少···不慎了解   怕进去太深了
作者: madezhi    时间: 2024-1-10 22:30
学习好资源

作者: 萌新苏苏    时间: 2024-1-11 03:03
啊啊啊啊啊啊啊啊啊
作者: FUYUEPC    时间: 2024-1-11 11:17
楼主辛苦了,谢谢楼主发的好帖子~
作者: 苏烟式    时间: 2024-1-11 15:30
这个有点高级哦
作者: ttuzi    时间: 2024-1-11 15:41
感谢分享
作者: chenyucheng    时间: 2024-1-12 21:25
尝试回复下载
作者: chenyucheng    时间: 2024-1-12 21:36
把代码改编成模块的了,你可以自行修改信息并发布。

sizeof-模块版.zip

1.03 MB, 下载次数: 3, 下载积分: 精币 -2 枚


作者: teachuser    时间: 2024-1-13 10:05
感谢分享,很给力!~
作者: quary    时间: 2024-1-13 19:12
谢谢楼主分享!!!
好人一生平安!!!

作者: 换行符    时间: 2024-1-14 11:13
支持开源~!感谢分享
作者: shuaicheng    时间: 2024-1-15 16:26
感谢分享大佬
作者: linchen888    时间: 2024-1-15 19:53
gx感谢分享
作者: 猪滴寳貝哝    时间: 2024-1-16 05:53
感谢分享,给力
作者: pyiping    时间: 2024-1-16 12:45
支持开源。谢谢分享
作者: 王业顺    时间: 2024-1-16 13:09

支持开源。谢谢分享
作者: 帅气与大侠    时间: 2024-1-16 16:21

提示:找不到通用型变量 需要到精易模块源码里找取指针_通用型(),复制下里面的通用型就可以了
  
子程序名返回值类型公开备 注
sizeof整数型 取数据结构的尺寸大小
参数名类 型参考可空数组备 注
变量通用型数据结构变量,不能是数组,且数据结构未赋值
变量名类 型静态数组备 注
pAddr整数型 
I整数型 
char字节型 
count整数型 
len整数型 
ptr整数型 
size整数型 
pAddr = __get (取指针_通用型 (变量), 0)
如果真 (pAddr > 0 pAddr < 10)
返回 (取数据类型尺寸 (pAddr))

循环判断首 ()
char = __get_byte (pAddr, I)
判断 (char = 171)
count = count + 1
count = 0

I = I + 1
循环判断尾 (count < 7)
len = I - count + 1
变量循环首 (0, len, 4, I)
ptr = __get (pAddr, I)
判断 (指针_是否有效 (ptr))
如果真 (__get (ptr, 0) = 1)  ' 如果开头是{1,0,0,0},可能是数组
ptr = ptr + 8

size = size + sizeof (ptr)
size = size + 4

变量循环尾 ()
如果真 (size ≠ 0)
size = size - 4
返回 (size)


作者: wtlax    时间: 2024-1-16 20:07
666666666666
作者: 牛儿飞    时间: 2024-1-16 23:03

作者: 韦贝贝    时间: 2024-1-17 15:25
易语言 sizeof 函数实现
作者: ww877    时间: 2024-1-17 17:14
666666666666666666666666666
作者: lm88818    时间: 2024-1-18 10:59
感谢分享,很给力!~
作者: clarand2024    时间: 2024-1-18 14:17
学习一下
作者: 夙愿ing    时间: 2024-1-18 20:22
感谢楼主分享
作者: xx1231    时间: 2024-1-19 10:59
感谢分享,学习下
作者: 给自己留一片天空    时间: 2024-1-20 10:39
感谢分享,很给力!~
作者: 木小果    时间: 2024-1-20 12:01
这个类型我用  取出来尺寸是 48
  
数据类型名公开备 注
WAVEINCAPS 
成员名类 型传址数组备 注
wMid短整数型  
wPid短整数型  
vDriverVersion   
szPname字节型 32
dwFormats   
wChannels短整数型  
wReserved1短整数型  



用你的sizeof取出来是 56



作者: 帅气与大侠    时间: 2024-1-20 17:10
木小果 发表于 2024-1-20 12:01
这个类型我用  取出来尺寸是 48
[e=2].版本 2

确实如你所说
不过易中的数据都是按4字节对齐的
短整数也给它分配了4字节{0,0,0,0}来储存
所以计算出来的是56

你可以试试WAVEINCAPS缓冲区的数据真实长度是48还是56
如果真实长度是48字节,memcpy()内存拷贝到WAVEINCAPS结构就会异常了,导致最后两个成员无值

如果是用的RtlMoveMemory_WAVEINCAPS(WAVEINCAPS,ptr,len)来拷贝就没问题,内存中应该有什么地方记录了成员的数据类型,在拷贝的时候做了赋值长度处理了

对于成员类型是短整数的,应该都会出现你说的会多n*2个长度
这个暂时找不到区分基础数据类型的方法
作者: lmwdz    时间: 2024-1-21 00:39
支持开源~!感谢分享
作者: hao198993    时间: 2024-1-21 11:43


卧槽,上次居然忘了上传源码。。。。。
作者: ︷蚁︷    时间: 2024-1-21 14:44
上面说明已经很清楚了,对照情况自行判断解决
作者: 佳大大    时间: 2024-1-21 21:10
不错不错 正好需要
作者: qqmqqg    时间: 2024-1-22 08:37
666666666666666666666666666
作者: 啊飘888    时间: 2024-1-22 14:23
易语言入门太简单了
作者: yyyxb    时间: 2024-1-23 10:53
谢谢大佬

作者: accet    时间: 2024-1-25 04:58
sizeof (取变量数据地址 (IP_ADAPTER_INFO))
作者: leiwawa001    时间: 2024-2-3 18:38
谢谢分享。
作者: 1349100304    时间: 2024-2-3 18:40
        感谢分享,很给力!~
作者: fcw888    时间: 2024-2-4 20:35
6666666
作者: xiao黄鸭    时间: 2024-2-5 18:19
zczccccccccccccccccccccccccccccccccccc
作者: 七颗心    时间: 2024-2-7 10:24

作者: 天使与恶魔    时间: 2024-2-13 22:09
666666666666666666666666666
作者: xiao黄鸭    时间: 2024-2-15 13:46
支持支持支持支持支持支持支持
作者: shaokui123    时间: 2024-2-18 01:26
感谢分享,很给力!~
作者: yuxuanju    时间: 2024-2-19 01:34
学习了,感谢分享。
作者: 煞老尸    时间: 2024-2-19 01:43
11111111111111111111111111111111111
作者: shaokui123    时间: 2024-2-20 07:48
感谢分享,很给力!~

作者: なす随风ぬね    时间: 2024-2-24 09:20
支持开源~!感谢分享
作者: zhijia    时间: 2024-2-24 23:47
学到了
作者: jiangjiang123    时间: 2024-2-25 12:10
6666666666666666666666
作者: 祥达电脑    时间: 2024-2-25 16:50

支持支持支持支持支持支持支持
作者: year1970    时间: 2024-2-27 08:40
感谢分享
作者: 风过无痕123    时间: 2024-2-29 02:14
66666666666666666666666666666666
作者: 等你路过hfm    时间: 2024-3-5 11:23
点开看一下还要用金币
作者: yoyohenry    时间: 2024-3-5 17:05
感谢楼主分享!
作者: wxxjs66    时间: 2024-3-9 23:32
666666666666666666




欢迎光临 精易论坛 (https://bbs.125.la/) Powered by Discuz! X3.4