CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

请问:这一行为什么通不过呢?

楼主hugoliang(鱼)2004-09-01 22:15:41 在 VC/MFC / 基础类 提问

我在编一个汉字转换成字型数据的程序,第一次写VC程序,感觉好难,这一行为什么通不过呢?  
  int   CSCommTestDlg::String2Hzk(CString   str,   CByteArray   &senddata)  
  {  
  int   highdata,lowdata,i;  
  int   hexdatalen=0;  
  FILE   *fp;  
  char   buffer[32];  
  unsigned   long   offset;  
  int   len=str.GetLength();  
  senddata.SetSize(len*16);  
  fp=fopen("HZK16","rb");  
  while(*str)  
              {highdata=*(str)-0xa0;  
                lowdata=*(str+1)-0xa0;-----------------------------这一行它抱错  
                offset=(94*(highdata-1)+(lowdata-1))*32L;  
          fseek(fp,offset,SEEK_SET);  
          fread(buffer,32,1,fp);  
  for(i=0;i<32;i++)  
  senddata[hexdatalen+i]=buffer[i];  
  hexdatalen+=32;  
  str+=2;  
  }  
  senddata.SetSize(hexdatalen);  
  return   hexdatalen;  
  }  
  错误信息为G:\SCommTest\SCommTestDlg.cpp(318)   :   error   C2666:   '+'   :   4   overloads   have   similar   conversions  
  应该怎么改呢?而且别的地方需要修改吗?万分感谢。 问题点数:100、回复次数:9Top

1 楼oldboy1234()回复于 2004-09-01 22:32:50 得分 30

因为CString   重载了好几个+   运算符,   这里的while循环可以这样改  
  int   nCurPos   =   0;   //   --   当前的字符  
  int   nLen   =   str.GetLength();  
  while(nCurPos   <   nLen)  
              {highdata=GetAt(nCurPos)-0xa0;  
                nCurPos++;  
                lowdata=GetAt(nCurPos)-0xa0;  
                offset=(94*(highdata-1)+(lowdata-1))*32L;  
          fseek(fp,offset,SEEK_SET);  
          fread(buffer,32,1,fp);  
  for(i=0;i<32;i++)  
  senddata[hexdatalen+i]=buffer[i];  
  hexdatalen+=32;  
  nCurPos+=2;  
  }Top

2 楼joeytry(在追求中尝试快乐)回复于 2004-09-01 22:40:46 得分 20

str是一个CString对象,她与字符串指针有区别,你可以使用(LPCTSTR)str对str对象强制转化成字符串指针TCHAR   *  
  你的问题在于CString对象本身重载了+运算符,譬如一个CString对象a="abc",你用a+1他会看作是重载的运算符,而不是指针运算,这样a+1的结果就有可能是"abc1",当你指示str+1的时候,他不知道该用哪个,所以你正确的用法应该是  
  LPCTSTR   str_temp   =   (LPCTSTR)str;  
  while(*str_temp){  
  ...  
  }Top

3 楼ddszhan(高等数学)回复于 2004-09-02 08:50:23 得分 10

CString重载了N个+号运算符。  
  应该先对str进行类型转换。Top

4 楼LongLongAgoImBoy(ThereIsAMe)回复于 2004-09-02 09:07:15 得分 30

......  
  senddata.SetSize(len*16);  
  fp=fopen("HZK16","rb");  
  char   *p   =   str.GetBuffer(0);  
  while(*p)  
  {  
  highdata=*p-0xa0;  
  lowdata=*(p+1)-0xa0;  
  offset=(94*(highdata-1)+(lowdata-1))*32L;  
  fseek(fp,offset,SEEK_SET);  
  fread(buffer,32,1,fp);  
  for(i=0;i<32;i++)  
  senddata[hexdatalen+i]=buffer[i];  
  hexdatalen+=32;  
  p+=2;  
  }  
  ......Top

5 楼seilfer2000(郁闷,疯狂学习中)回复于 2004-09-02 09:25:51 得分 10

楼上的方法应该可以,但是你  
  int   CSCommTestDlg::String2Hzk(CString   str,   CByteArray   &senddata)  
  while(*str)  
  这里就应该出错啊Top

6 楼wj59(wj59)回复于 2004-09-02 09:53:38 得分 0

不要用CString  
  Top

7 楼hugoliang(鱼)回复于 2004-09-03 21:19:54 得分 0

我改过了,按照   LongLongAgoImBoy(ThereIsAMe)说的方法,程序如下:  
  int   CSCommTestDlg::String2Hzk(CString   str,   CByteArray   &senddata)  
  {  
  int   highdata,lowdata,i;  
  int   hexdatalen=0;  
  FILE   *fp;  
  char   buffer[32];  
  unsigned   long   offset;  
  int   len=str.GetLength();  
  senddata.SetSize(len*16);  
  fp=fopen("HZK16","rb");  
  char   *p   =   str.GetBuffer(0);  
  while(*p)  
              {highdata=*(p)-0xa0;  
                lowdata=*(p+1)-0xa0;  
                offset=(94*(highdata-1)+(lowdata-1))*32L;  
          fseek(fp,offset,SEEK_SET);  
          fread(buffer,32,1,fp);  
  for(i=0;i<32;i++)  
  senddata[hexdatalen+i]=buffer[i];  
  hexdatalen+=32;  
  p+=2;  
  }  
  senddata.SetSize(hexdatalen);  
  return   hexdatalen;  
  }  
  可是我送出"你好吗"   三个字,  
  字型数据为00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   00   10   E0   71   B0   33   18   33   18   33   18   33   18   31   B8   30   F8   30   18   33   18   31   B6   78   E6   00   00   00   00   00   00   10   08   24   F4   2C   84   44   82   44   82   44   E2   44   12   44   12   44   12   44   92   44   92   2E   64   20   04   10   08   00   00    
  而且奇怪的是如果只输入一个字,为什么32B全是0呢?  
  真的很感谢大家给我讲得这样细,谢谢谢谢Top

8 楼CaptainIII(山上人)回复于 2004-09-03 21:28:49 得分 0

你还不如把这个转换的公式讲清楚,重新编一个比看程序快,反正我这里正好没有开发环境。Top

9 楼hugoliang(鱼)回复于 2004-09-04 11:29:47 得分 0

不好意思,我是个新手,我只是仿造一个函数写的,真的不知道应该怎样说清楚,帮帮忙吧,谢谢了Top

相关问题

  • 为什么报表中只有一行?
  • 为什么单元格只有一行?
  • 为什么只输出一行?
  • 为什么通不过?
  • 帮忙看看为什么通不过?
  • 为什么连编译都通不过????
  • LoginDialog('a', 'b', 'c')为什么通不过?
  • 为什么编译通不过?
  • 这段又为什么通不过?
  • 为什么通不过编译?

关键词

  • highdata
  • lowdata
  • 一行
  • fp
  • offset
  • str

得分解答快速导航

  • 帖主:hugoliang
  • oldboy1234
  • joeytry
  • ddszhan
  • LongLongAgoImBoy
  • seilfer2000

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo