写了个函数,怎么都得不到想要的结果,求救!
- C/C++ code
#include<stdio.h>typedef unsigned char UCHAR;typedef unsigned char uchar;unsigned long BcdtoHex(UCHAR *bcd){ unsigned long hex=0,temp; temp=(*bcd)/16; hex+=(temp*100000+(*bcd)%16*10000); printf("%ld\n",hex); temp=(*bcd++)/16; hex+=(temp*1000+(*bcd+1)%16*100); printf("%ld\n",hex); temp=(*bcd++)/16; hex+=(temp*10+(*bcd+2)%16); printf("%ld\n",hex); return(hex);}int main(){ uchar arr[3] = {0x11,0x55,0x99}; BcdtoHex(arr);}调试结果是
110000
111600
111661
而并非我所想的
110000
115500
115599
请问,这个函数哪里有错误啊?
*bcd作为一个uchar地址参数给了这个函数,+1就是从首地址偏移1字节的啊?+2就是首地址偏移2字节的啊,正好对应着
首地址&(0x11),偏移后的地址&(0x55),和&(0x99)。哪里错了啊??????????
[解决办法]
单步调试了没?
+1就是从首地址偏移1字节的啊?
这个理解不对,+1是偏移一个sizeof(uchar)
[解决办法]
单步一下不就知道了?
大概是
hex+=(temp*1000+(*bcd+1)%16*100);
后边不要+1,同样后边哪个不用+2
[解决办法]
unsigned long BcdtoHex(UCHAR *bcd)
{
unsigned long hex=0,temp;
temp=(*bcd)/16;
hex+=(temp*100000+(*bcd)%16*10000);
printf("%ld\n",hex);
temp=(bcd[1])/16;
hex+=(temp*1000+(bcd[1])%16*100);
printf("%ld\n",hex);
temp=(bcd[2])/16;
hex+=(temp*10+(bcd[2])%16);
printf("%ld\n",hex);
return(hex);
}
[解决办法]
不要直接操作指针,既然是传递数组 直接取值就是了 稍微改良一下 加个for循环都可以
[解决办法]
原来问题还不止一点
temp=(*bcd++)/16;
hex+=(temp*1000+(*bcd+1)%16*100);
修改为
temp=(*(++bcd))/16;
hex+=(temp*1000+(*bcd)%16*100);
下边一样
[解决办法]
unsigned long BcdtoHex(UCHAR *bcd)
{
unsigned long hex=0,temp;
temp=(*bcd)/16;
hex+=(temp*100000+(*bcd)%16*10000);
printf("%ld\n",hex);
temp=(*bcd++)/16; //temp = (*(++bcd))/16;
hex+=(temp*1000+(*bcd+1)%16*100);
printf("%ld\n",hex);
temp=(*bcd++)/16;
hex+=(temp*10+(*bcd+2)%16);
printf("%ld\n",hex);
return(hex);
}
[解决办法]
#include<stdio.h>
typedef unsigned char UCHAR;
typedef unsigned char uchar;
typedef unsigned long DWORD;
DWORD BcdtoHex(UCHAR *bcd,DWORD n)
{
DWORD hex=0,temp,p=100000;
for (DWORD i=0;i<n;i++)
{
temp=*(bcd+i)/16;
hex+=(temp*p+*(bcd+i)%16*(p/10));
printf("%ld\n",hex);
p/=100;
}
return(hex);
}
int main()
{
uchar arr[3] = {0x11,0x55,0x99};
BcdtoHex(arr,sizeof(arr));
}
你看看这个怎么样 我也是新手 一起学习之
[解决办法]
(*(bcd++))和(*(++bcd)) 不一样的
(*(bcd++))是先用bcd值参与运算在自加,而(*(++bcd))而则是bcd先自加后在参与运算,
两者的bcd最终结果一样,但过程不同。