请问:这一行为什么通不过呢?
我在编一个汉字转换成字型数据的程序,第一次写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




