本帖最后由 flying1104 于 2024-2-21 09:12 编辑
首先感谢硬汉和18291005374
第9期:全键盘拼音输入法界面设计
emwin26键输入法
使用过程中有一些问题,在这里反馈一下,不知是否正确
使用keil环境编译
问题1
[C] 纯文本查看 复制代码 char *PYSearch(unsigned char *msg , int *num)
其中 * num为int类型
[C] 纯文本查看 复制代码 static uint16_t s_Hznum;
ptr = PYSearch(s_tempbuf, (int *)&s_Hznum);
外部定义为uint16_t
这样会造成PYSearch返回的时候,其他相邻的内存空间
例如
[C] 纯文本查看 复制代码 char s_PyBuf[100]={0};//拼音存放的数组
static uint16_t s_HzNum; //汉字数量
char s_HzBuf[512]={0};//存放汉字的数组
char *s_BufView[128]={0};//存放显示汉字的数组
这里定义后内存地址分布如下
[C] 纯文本查看 复制代码 s_HzNum 0x2402a22e
s_PyBuf 0x2402a230
这样返回的时候,就会侵占0x2402a230到造成s_PyBuf键盘存储抹掉为0
解决: static uint32_t s_Hznum;
问题2
[C] 纯文本查看 复制代码 /* 以读音为*msg开头的所有拼音检索 */[/size]
tailpcb = PYRankThreeList[*msg - 'a'];
/* 以读音为*msg+1开头的所有拼音检索 */
headpcb = PYRankThreeList[*msg - 'a' + 1];
for(; tailpcb < headpcb; tailpcb++)
{
/* 检查输入的拼音与检索结构体中的拼音是否一致 */
for(i = 0; i < count - 1; i++)
{
if(*((*tailpcb).PYSerList + i) != msg[i + 1])
{
break;
}
}
/* 一致,返回指针 */
if(i == (count - 1))
{
/* 特别注意下面这个函数,因为UTF-8编码格式的汉字是3个字节 */
*num = strlen((const char *)(*tailpcb).PYRankOneList) / 3;
return (char *)(*tailpcb).PYRankOneList;
}
}
其中tailpcb是需要和headpcb进行对比来确定拼音的检索的
他们是通过存储地址来递增,但编译后的地址如下图
问题在于e和z
end的位置因为是依据字母排序的,因此被放在了e的后面而非z的后面
造成e和z的对比错误
将PYRankTwoList_end改为PYRankTwoList_zz解决问题
|