开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 3146|回复: 20
收起左侧

[闲聊] 易语言里踩到的坑汇总

[复制链接]

结帖率:100% (9/9)
发表于 2022-1-8 20:26:23 | 显示全部楼层 |阅读模式   广西壮族自治区崇左市
本帖最后由 福仔 于 2022-1-9 15:16 编辑
1. 易语言的 超级列表框, 树型框, 如果按下面的方式清空所有项目的话, 易语言的做法是销毁这个组件, 重新创建一个所以, 想要保证窗口句柄不变的话, 就不能使用下面的方式
影响: 窗口句柄会被改变, 影响还是很大的, 比如子类化这些, 就不得不重新子类化一次
解决方案: 使用组件提供的清空命令

  
子程序名返回值类型公开备 注
_按钮1_被单击  
信息框 (超级列表框1.取窗口句柄 (), 0, , )
超级列表框1.报表列 = {  }
信息框 (超级列表框1.取窗口句柄 (), 0, , )
信息框 (树型框1.取窗口句柄 (), 0, , )
树型框1.项目 = {  }
信息框 (树型框1.取窗口句柄 (), 0, , )


i支持库列表   支持库注释   
iext扩展界面支持库一



2. 易语言的数据结构, 强制4字节对齐, 这个应该说是易语言的特色, 只不过这个特色代价有点大
比如, c++里的一个结构这个结构占用了4个字节, 因为每个成员一个字节, 修改对应的成员就是修改ARGB颜色里对应的颜色通道
直接把这个结构的内存按整数型的方式读出来, 那他就是一个ARGB整数型的颜色值
int argb = *((int*)&ARGB_STRUCT); 这么用是可以直接把结构转换成argb整数型的颜色
[C++] 纯文本查看 复制代码
struct ARGB_STRUCT{
    BYTE b;
    BYTE g;
    BYTE r;
    BYTE a;
};


同样的类型, 在易语言里这么定义, 易语言这个结构就占用 16 个字节, 必须使用特定的方法才能把这个结构转换成一个整数型的ARGB颜色
比如: 字节集 = { 结构.b, 结构.g, 结构.r, 结构.a} argb = 取字节集数据(字节集, #整数型)
得这么处理一下才能转换成整数型的argb颜色值
  
数据类型名公开备 注
数据类型_ARGB通道 
成员名类 型传址数组备 注
b字节型  
g字节型  
r字节型  
a字节型  




再比如, c++里, 这个结构占用260个字节, 但是在易语言里这么写, 就只是占用4个字节而已, 易语言里的这个成员只是存放一个地址, 这个地址指向这个数组
[C++] 纯文本查看 复制代码
struct TEST{
    char buf[260];
};


  
数据类型名公开备 注
数据类型1 
成员名类 型传址数组备 注
buf字节型 260




影响: 和win32 API 不通用, 很多win32 API需要的数据结构在易语言这里都需要二次处理
    比如像读取文件的PE结构, 在易语言里处理起来会比较麻烦
    因为易语言的数据结构是4字节对齐, 但是pe结构里, 有不少的成员都是只占用1-2个字节的
    所以易语言这边修改结构后不好把结构转换成字节集数据

解决方法:
    (1). 申请一块内存, 自己往内存里写成员, 缺点是对新手不友好, 优点是速度快
    (2). 定义N个内存拷贝API, api的参数类型就写你要拷贝的类型, 优点是简单, 缺点是速度慢, 并且需要声明N个拷贝API
        拿上面的颜色结构和颜色值互换来演示, 需要定义几个内存拷贝的api

  
DLL命令名返回值类型公开备 注
内存拷贝_从颜色值传址拷贝到_数据类型_颜色值_结构整数型 
DLL库文件名:
 
在DLL库中对应命令名:
RtlMoveMemory
参数名类 型传址数组备 注
结构数据类型_颜色值
颜色值整数型
拷贝尺寸整数型
DLL命令名返回值类型公开备 注
内存拷贝_从数据类型_颜色值_结构_拷贝到颜色值传址整数型 
DLL库文件名:
 
在DLL库中对应命令名:
RtlMoveMemory
参数名类 型传址数组备 注
颜色值整数型
结构数据类型_颜色值
拷贝尺寸整数型
DLL命令名返回值类型公开备 注
内存拷贝_从颜色值拷贝到_数据类型_颜色值_结构整数型 
DLL库文件名:
 
在DLL库中对应命令名:
RtlMoveMemory
参数名类 型传址数组备 注
结构数据类型_颜色值
颜色值整数型
拷贝尺寸整数型
DLL命令名返回值类型公开备 注
内存拷贝_从数据类型_颜色值_结构_拷贝到颜色值整数型 
DLL库文件名:
 
在DLL库中对应命令名:
RtlMoveMemory
参数名类 型传址数组备 注
颜色值整数型
结构数据类型_颜色值
拷贝尺寸整数型

子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
结构数据类型_颜色值 
argb整数型 
内存拷贝_从颜色值传址拷贝到_数据类型_颜色值_结构 (结构, -1, 4)  ' 把颜色值 -1 转换成颜色结构, 4个成员都是255
内存拷贝_从数据类型_颜色值_结构_拷贝到颜色值传址 (argb, 结构, 4)
调试输出 (结构.a, 结构.r, 结构.g, 结构.b, argb)


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



3. 取反, 是按位的最后一位进行取反
影响: 如果这个被取反的逻辑型的值最后一位是0, 并且这个逻辑型是真值, 那么取反后结果不变
解决方法: 逻辑值=逻辑值 = 真, 取反(逻辑值)    先把逻辑值重新赋值, 然后再取反
      或者: 判断(逻辑值 = 真), 判断(逻辑值 = 假), 不要用取反
因为之前有遇到过一个模块的命令, 判断传递的路径是否为目录, 函数内部是 返回(GetFileAttributesA (文件路径))
忘了是不是精易模块了, 至少现在的精易模块的 文件_是否为目录() 不是这样
如果是目录, 那么就是返回16, 然后这个api定义的返回值是逻辑型, 那么这个逻辑型就是16, 输出的值是真
但是16的二进制最后一位是0, 取反后这个值还是真, 那时候就因为这个问题, 不知道排查了多久....然后就记住了这个坑.....
备注: 二进制一般是从右往左的顺序读, 最右边是第0位, 这里方便理解, 就采用从左往右的顺序
  
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
a逻辑型 
写到内存 (2, 取变量地址 (a), 4)  ' 2的二进制是 10, 最后一位是0, 那么取反得到的
调试输出 (a)  ' 输出真, 因为a不等于0
调试输出 (取反 (a))  ' 输出真, 因为a实际是等于2, 2的最后一位是0, 取反, 就是把最后一位取反



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







4. 待更新, 有什么坑欢迎跟帖留言, 慢慢把各位踩到的坑做一个汇总....


评分

参与人数 5好评 +4 精币 +7 收起 理由
小了白了兔 + 1 新技能已get√
Suky + 1 + 2 这帖子应该置顶
Terrell + 1 新技能已get√
callng + 1 + 2 很赞同,谢谢!
钢铁侠9999 + 1 + 2 瞧瞧,人家这就是专业,这还不是大佬?

查看全部评分

结帖率:100% (9/9)

签到天数: 6 天

 楼主| 发表于 2022-4-17 11:05:44 | 显示全部楼层   广西壮族自治区南宁市
本帖最后由 福仔 于 2022-4-17 11:12 编辑

4. 易语言数值运算都是浮点运算的问题
影响: 长整数的加减乘除运算有可能导致精度丢失, 从而造成运算结果不正确
解决方法: 暂时没有比较有效的方法, 只能自己用汇编实现数值的运算, 让易语言调用
               论坛里有人开源过这些运算函数, 4字节或者4字节以下的, 自己封装一个加减乘除法
               8字节的, 自己封装一个8字节专用的加减乘除法, 因为易语言编译出来的都是32位, 一个寄存器存放不了8个字节

原贴: 两个奇数相乘, 竟然得出一个偶数


易语言的数值运算都是浮点运算, 浮点数就会有精度, 转换的过程就有可能会丢失精度
长整数没有实际测试, 之前只测试过整数型, 不过看这结果, 长整数应该也是浮点运算


回复 支持 反对

使用道具 举报

结帖率:17% (1/6)

签到天数: 1 天

发表于 2022-8-19 21:11:25 | 显示全部楼层   广东省广州市
福仔 发表于 2022-4-17 11:05
4. 易语言数值运算都是浮点运算的问题
影响: 长整数的加减乘除运算有可能导致精度丢失, 从而造成运算结果不 ...

这个就很坑了
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2022-7-29 20:25:24 | 显示全部楼层   江苏省盐城市
的确专业,大佬不愧为大佬
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2022-1-10 17:42:18 | 显示全部楼层   重庆市重庆市
本帖最后由 风清云游 于 2022-1-10 17:44 编辑

参考打勾   复制过来 勾没了
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2022-1-10 17:41:55 | 显示全部楼层   重庆市重庆市
  
子程序名返回值类型公开备 注
逻辑校正 
参数名类 型参考可空数组备 注
逻辑逻辑型
置入代码 ({ 139, 125, 8 })  ' mov edi,[ebp+8]
置入代码 ({ 139, 7 })  ' mov eax,[edi]
置入代码 ({ 133, 192 })  ' test eax,eax
置入代码 ({ 116, 5 })  ' je 7
置入代码 ({ 131, 200, 1 })  ' or eax,1
置入代码 ({ 137, 7 })  ' mov [edi],eax
置入代码 ({ 201 })  ' leave
置入代码 ({ 194, 4, 0 })  ' ret 4


回复 支持 反对

使用道具 举报

发表于 2022-1-10 07:43:45 | 显示全部楼层   广东省揭阳市
大佬出没,众生退散!
回复 支持 反对

使用道具 举报

结帖率:100% (9/9)

签到天数: 6 天

 楼主| 发表于 2022-1-9 14:25:26 | 显示全部楼层   广西壮族自治区崇左市
风清云游 发表于 2022-1-8 22:35
4字节对齐 当你不知道的时候是坑 当你知道的时候 未必是坑
260字节 其实易语言的方式更好一些  ...

个人感觉, 还是直接结构占用260个字节的好, 这样在定义这个结构的时候是从栈里申请空间, 而不是从堆里
栈里申请的空间就一行汇编改变esp就得到空间了, 只不过空间有限而已, 但是速度那是相当的快

易语言这种模式是 指针 -> 指针, 指针指向指针, 存放这一块数据他是申请了两块内存来存放, 地址不是连续的
如果你需要把数据写出文件, 并且需要按1/2个字节来处理的话, 易语言这个4字节对齐很显然就不好做
[C++] 纯文本查看 复制代码
typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;
        WORD       biPlanes;      // 两个字节, 在易语言里占用4个字节
        WORD       biBitCount;   // 两个字节, 在易语言里占用4个字节
        DWORD      biCompression;
        DWORD      biSizeImage;
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;


比如这个 位图信息头的结构, 这个位图信息头的尺寸就这么大, 如果用易语言来写这个头, 那就会多4个字节, 从而导致位图信息头不正确, 位图无法打开
这是很多例子中的一个, 因为这个之前在我讲 gdi位图的时候遇到了, 所以对这个印象比较深, 最后还是用指针的方式去解决....
所以4字节对齐, 在很多时候, 都不是很友好
【gdi/gdi+自绘入门】07.对象-位图_精易论坛 (125.la)


回复 支持 反对

使用道具 举报

结帖率:89% (34/38)
发表于 2022-1-9 10:59:40 | 显示全部楼层   广东省惠州市
设计思路存在缺陷
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2022-1-8 23:41:43 | 显示全部楼层   湖北省宜昌市
元老 发表于 2022-1-8 20:44
还有一条:被叫一次大佬后,这帽子就摘不掉了

大佬好     
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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