开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 1165|回复: 22
收起左侧

[源码] 【炫语言】文本型与易语言的文本型的关系【避坑】

[复制链接]
发表于 2024-9-13 10:16:03 | 显示全部楼层 |阅读模式   重庆市重庆市
易语言中:常识:只有一种文本型,可以存储ANSI文本内容和UTF8文本内容,易语言的文本型变量内本质是一个内存地址,地址指向一段内存区域用于存放文本数据,在数据末尾用字节0标识文本结束。
小知识:假设文本数据末尾遇不到字节0,程序就会出现异常崩溃,因为代码会一直寻找到字节0才结束,当寻找长度超出该内存块长度就相当于溢出了,再继续将出现无法预料的BUG。之所以这样就是因为文本型本身不存储数据长度。前面说可以存储UTF8,因为UTF8也是以字节0作为结束标识,但实际上易语言中的各种库和模块自身只认为文本型是ANSI编码,实际操作中还是存在问题的。


在炫语言中:
常识:由于是基于C++的,所以有字符型、字符型A、文本型、文本型A四种文本型数据类型
字符型 :存储一个字符(两个字节,通常用于UTF16字符),可以定义为数组来存储固定长度文本
字符型A:存储一个字符(一个字节,通常用于ANSI字符和UTF8字符),可以定义为数组来存储固定长度文本
文本型:存储一段(字符型为单位)文本内容,属于面向对象的类,提供多种文本常用处理方法(实际数据末尾无需用字节0结束)
文本型A:存储一段(字符型A为单位)文本内容,属于面向对象的类,提供多种文本常用处理方法(实际数据末尾无需用字节0结束)

QQ20240913-101145.png

在易语言中的【文本型】等同于炫语言中的【字符型A*】,字符型A带星号表示这是一个C++的指针变量,意思是这个变量本身是直接指向内存地址的,因此这里的字符型A代表的是目的内存中的一段文本数据了,不仅仅是单个字符。


这里分享一个最近遇到的比较坑实际案例:
QQ20240913-093111.png

这是一个模仿易语言中外部编辑框_取行文本的炫语言代码,这里定义的是字符型数组(【字符型】数组作为参数时相当于【字符型*】),事实上这段代码和很多易语言代码中的外部编辑框_取行文本都存在一个错误的操作。

分析:这里的196时指的EM_GETLINE窗口消息,用于获取编辑框指定行的文本,消息参数1代表具体行数,消息参数2代表接收返回的文本的地址,以精易模块为例,再调用时我们都是先申请一段空白文本,然后取地址作为参数2,并且这种操作大多数情况居然是没有任何问题的。我们来看看微软官方文档对参数2的解释:
指向接收行副本的缓冲区的指针。 在发送消息之前,将此缓冲区的第一个单词设置为缓冲区的大小(以 TCHAR为单位)。 对于 ANSI 文本,这是字节数;对于 Unicode 文本,这是字符数。 第一个单词中的大小被复制的行覆盖。
文档中明确说明,接收的文本缓冲区第一个字符(可能是单字节Ansi,双字节Unicode)必须先用来设置缓冲区的长度,之所以大家平时在易语言中使用错误用法都没出问题,实际上是我们易语言中的【取空白文本】是在文本缓冲区填充的非字节0的空白字符,而这个非字节0刚好碰巧成为了一个无意中指定的长度。(两个BUG在一起负负得正

评分

参与人数 1精币 +1 收起 理由
wa690602724 + 1 感谢分享,很给力!~

查看全部评分

签到天数: 12 天

发表于 2024-9-28 20:18:37 | 显示全部楼层   广西壮族自治区崇左市
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 20 天

发表于 2024-9-20 09:04:14 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:78% (7/9)

签到天数: 21 天

发表于 2024-9-19 10:44:27 | 显示全部楼层   福建省泉州市
学习学习
回复 支持 反对

使用道具 举报

签到天数: 20 天

发表于 2024-9-17 07:25:18 | 显示全部楼层   湖北省武汉市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:73% (8/11)

签到天数: 17 天

发表于 2024-9-15 15:06:45 | 显示全部楼层   河南省焦作市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:92% (24/26)

签到天数: 10 天

发表于 2024-9-15 13:18:52 | 显示全部楼层   广东省惠州市
挺好,一直在学习。
回复 支持 反对

使用道具 举报

结帖率:100% (45/45)

签到天数: 20 天

发表于 2024-9-14 22:49:02 | 显示全部楼层   新疆维吾尔自治区阿克苏地区
挺好,一直在学习。。
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 20 天

发表于 2024-9-14 08:24:15 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 16 天

发表于 2024-9-14 03:12:41 | 显示全部楼层   江西省上饶市
分享得很精辟。
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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