OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2033|回复: 4

程序总是死在void unigbk_exchange(u8 *src,u8 *dst,u8 mode)

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-1-15
在线时间
4 小时
发表于 2018-1-15 11:09:45 | 显示全部楼层 |阅读模式
1金钱
在调试程序的时候,想用这个函数把ucs2转换成gbk码,但是程序执行到这里的时候就死在这个函数里了,下面是代码:


//unicode gbk ת»»º¯Êý
//src:ÊäÈë×Ö·û´®
//dst:Êä³ö(uni2gbkʱΪgbkÄÚÂë,gbk2uniʱ,Ϊunicode×Ö·û´®)
//mode:0,unicodeµ½gbkת»»;
//     1,gbkµ½unicodeת»»;
void unigbk_exchange(u8 *src,u8 *dst,u8 mode)
{
u16 temp;
u8 buf[2];
if(mode)//gbk 2 unicode
{
  while(*src!=0)
  {
   if(*src<0X81) //·&Ccedil;&ordm;&ordm;×&Ouml;
   {
    temp=(u16)ff_convert((WCHAR)*src,1);
    src++;
   }else    //&ordm;&ordm;×&Ouml;,&Otilde;&frac14;2&cedil;&ouml;×&Ouml;&frac12;&Uacute;
   {
    buf[1]=*src++;
    buf[0]=*src++;
    temp=(u16)ff_convert((WCHAR)*(u16*)buf,1);
   }
   *dst++=hex2chr((temp>>12)&0X0F);
   *dst++=hex2chr((temp>>8)&0X0F);
   *dst++=hex2chr((temp>>4)&0X0F);
   *dst++=hex2chr(temp&0X0F);
  }
}else //unicode 2 gbk
{
  printf("\r\n unigbk test");
  while(*src!=0)
  {
   printf("\r\n unigbk test4");
   buf[1]=chr2hex(*src++)*16;
   printf("\r\n unigbk test5");
   buf[1]+=chr2hex(*src++);
   buf[0]=chr2hex(*src++)*16;
   buf[0]+=chr2hex(*src++);
   printf("\r\n unigbk test6");

    temp=(u16)ff_convert((WCHAR)*(u16*)buf,0);
   printf("\r\ntemp:%d",temp);
   if(temp<0x80){*dst=temp;dst++;printf("\r\n unigbk test2");}
   else {*(u16*)dst=swap16(temp);dst+=2;printf("\r\n unigbk test3");}
  }
}
*dst=0;//&Igrave;í&frac14;&Oacute;&frac12;á&Ecirc;&oslash;·&ucirc;
}



执行结果:
unigbk test
unigbk test4
unigbk test5
unigbk test6
unigbk test9
temp:84


如要将   if(temp<0x80){*dst=temp;dst++;printf("\r\n unigbk test2");}中   if(temp<0x80)改成  if(temp<80) 程序会执行else后面的语句,会一样会死在这里,执行结果 为:
  unigbk test
unigbk test4
unigbk test5
unigbk test6
unigbk test9
temp:84

unigbk test3



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-1-15
在线时间
4 小时
 楼主| 发表于 2018-1-15 11:11:33 | 显示全部楼层
请原子哥还有各位高手帮忙看看,谢谢!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-16 01:30:21 | 显示全部楼层
你仿真,单步跟踪,看怎么死的?
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-1-15
在线时间
4 小时
 楼主| 发表于 2018-1-16 15:21:20 | 显示全部楼层
本帖最后由 rickl 于 2018-1-16 15:24 编辑
正点原子 发表于 2018-1-16 01:30
你仿真,单步跟踪,看怎么死的?

直接死这一步
printf("\r\ntemp:%d",temp);  ///这一步的结果是 84,是对,执行if语句之后就死掉啦

   if(temp<0x80){*dst=temp;dst++;printf("\r\n unigbk test2");}
   else {*(u16*)dst=swap16(temp);dst+=2;printf("\r\n unigbk test3");}
  }

上一步打印的值是84,是对的,但是就是到这里就死掉啦
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-17 01:16:49 | 显示全部楼层
rickl 发表于 2018-1-16 15:21
直接死这一步
printf("\r\ntemp:%d",temp);  ///这一步的结果是 84,是对,执行if语句之后就死掉啦[/ba ...

估计你的dst指针乱指了,你看下dst的值
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 10:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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