flying1104 发表于 2024-2-21 09:03:24

emwin 全键盘的问题反馈

本帖最后由 flying1104 于 2024-2-21 09:12 编辑

首先感谢硬汉和18291005374
第9期:全键盘拼音输入法界面设计
emwin26键输入法

使用过程中有一些问题,在这里反馈一下,不知是否正确
使用keil环境编译
问题1
char *PYSearch(unsigned char *msg , int *num)
其中 * num为int类型
static uint16_ts_Hznum;   
ptr = PYSearch(s_tempbuf, (int *)&s_Hznum);
外部定义为uint16_t
这样会造成PYSearch返回的时候,其他相邻的内存空间
例如
char s_PyBuf={0};//拼音存放的数组
static uint16_ts_HzNum; //汉字数量
char s_HzBuf={0};//存放汉字的数组
char*s_BufView={0};//存放显示汉字的数组
这里定义后内存地址分布如下
s_HzNum                                  0x2402a22e   
s_PyBuf                                  0x2402a230
这样返回的时候,就会侵占0x2402a230到造成s_PyBuf键盘存储抹掉为0
解决: static uint32_t s_Hznum;


问题2
/* 以读音为*msg开头的所有拼音检索 */
      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)
                        {
                              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解决问题







eric2013 发表于 2024-2-21 09:55:34

谢谢楼主分享。
页: [1]
查看完整版本: emwin 全键盘的问题反馈