首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

写了个函数,如何都得不到想要的结果,

2012-05-27 
写了个函数,怎么都得不到想要的结果,求救!C/C++ code#includestdio.htypedef unsigned char UCHARtyped

写了个函数,怎么都得不到想要的结果,求救!

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最终结果一样,但过程不同。

热点排行