本帖最后由 帅气与大侠 于 2024-1-1 01:04 编辑
年末了,今年又学习到了不少新知识, 跟大家分享下易语言 sizeof 实现方法。 日常开发中,经常要调用某些 api 函数,拷贝来拷贝去,其中不免会遇到要填写某个数据类型的结构尺寸
看 api 文档别的语言是通过 sizeof(var) 去统计某些结构体的尺寸,但是咱易语言没有。
最早我是拿手指头一个一个数的,经常手指头不够用。
后来学到了用 LocalSize () 函数,将参数类型改为具体的数据类型去计算
每次遇到新数据类型结构就要新定义一个DLL,也很麻烦!
刚好近期消化了不少关于内存的知识,就尝试下看看,调试观察了各种各样的数据类型,大致是了解清楚了存储机制,把 sizeif 的功能搞出来了。
不过有点小瑕疵,就是参数无法弄成通用型的,要额外:取指针地址(变量)传入。
强制取通用型测试会异常,有大佬会弄的可以试试弄成通用型变量。
完整源码下载:
sizeof.zip
(384.42 KB, 下载次数: 132)
源码预览:
变量名 | 类 型 | 静态 | 数组 | 备 注 | IP_ADAPTER_INFO | IP_ADAPTER_INFO | | | 测试数据类型 | 测试数据类型 | | | 多层嵌套数据结构 | 多层嵌套数据结构 | | | 调试输出 (sizeof (取指针地址 (IP_ADAPTER_INFO )) )调试输出 (sizeof (取指针地址 (多层嵌套数据结构 )), LocalSize_多层嵌套数据结构 (多层嵌套数据结构 )) 调试输出 (sizeof (取指针地址 (测试数据类型 )) )调试输出 (sizeof ( #字节型 ), sizeof ( #短整数型 ), sizeof ( #整数型 ), sizeof ( #长整数型 ), sizeof ( #小数型 ), sizeof ( #双精度小数型 ), sizeof ( #逻辑型 ), sizeof ( #日期时间型 ), sizeof ( #子程序指针型 )) 返回 (0 ) 变量名 | 类 型 | 静态 | 数组 | 备 注 | pAddr | 整数型 | | | size | 整数型 | | | len | 整数型 | | | I | 整数型 | | | ptr | 整数型 | | | 如果真 (param > 0 且 param < 10 )返回 (取数据类型尺寸 (param )) pAddr = param len = __getPtrLen (pAddr )变量循环首 (0, len, 4, I ) ptr = __get (pAddr, I ) 判断 (指针_是否有效 (ptr ) = 真) ptr = __getRedirArrPtr (ptr ) size = size + sizeof (ptr ) size = size + 4 变量循环尾 () 如果真 (size ≠ 0 )size = size - 4 返回 (size)|
__getPtrLen | 整数型 | | |
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 | 整数型 | | |
pAddr | 整数型 | | | | 如果真 (__get_byte (pAddr, 0 ) = 1 )offset = __get (pAddr, 4 ) 如果真 (__get (pAddr + 8, offset ) = -1414812757 且 __get (pAddr + 12, offset ) = -1414812757 ) 返回 (pAddr + 8 )返回 (pAddr) |