形参和实参数据传递中遇到的问题

ustczjr 2012-04-16 09:22:21
直接上代码:

void ccpCommand(unsigned char *com )
{
unsigned char a[4]; //用于观察形参的值是否正确

a[0]=com[2];
a[1]=com[3];
a[2]=com[4];
a[3]=com[5];

ccp.ProtectionStatus |= ccpUnlock(&com[2]);

}

函数中调用的ccpUnlock函数定义如下:

unsigned char ccpUnlock( unsigned char *key )
{
unsigned long temp;

ccpLastSeed = 0x4f833483;

temp = *(unsigned long *)key;

if ( temp != ccpLastSeed )
{
return 0;
}

return 1;
}

通过观察a数组,发现数组元素的值分别为
a[0]=0x83;
a[1]=0x34;
a[2]=0x83;
a[3]=0x4f;
通过调用ccpUnlock函数,得到的temp应该和ccpLastSeed值相等,都是0x4f833483,返回的应该是1,可是通过观察,
temp的值居然是0,导致函数返回值为0.后面的操作就都错了。

一头雾水啊,求大侠指点~
...全文
1093 点赞 收藏 43
写回复
43 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ustczjr 2012-04-23
明白了,在此谢过~[Quote=引用 39 楼 的回复:]

程序按小端模式编写,但不幸的是,飞思卡尔的单片机是大端模式!
[/Quote]
回复
ustczjr 2012-04-23
在此谢过~[Quote=引用 39 楼 的回复:]

程序按小端模式编写,但不幸的是,飞思卡尔的单片机是大端模式!
[/Quote]
回复
ustczjr 2012-04-23
在此谢过~[Quote=引用 38 楼 的回复:]

这个是对指针与数据类型理解的问题
unsigned char com[4];
com[0] = 0x12;
com[1] = 0x34;
com[2] = 0x56;
com[3] = 0x78;

如果com的地址为基地直:以下内存的数据分配为:0x12,0x34,0x56,0x78
而如果是以unsigned long 型,其为4个字节长,以X86架构小端来说,其低位存在于低……
[/Quote]
回复
kason2011 2012-04-23
我是来看看已结贴的帖子还能不能回复的
回复
这个是对指针与数据类型理解的问题
unsigned char com[4];
com[0] = 0x12;
com[1] = 0x34;
com[2] = 0x56;
com[3] = 0x78;

如果com的地址为基地直:以下内存的数据分配为:0x12,0x34,0x56,0x78
而如果是以unsigned long 型,其为4个字节长,以X86架构小端来说,其低位存在于低地址为则其内存数据为:
0x78,0x56,0x34,0x12
所以这是数据裁剪问题与类据类型的组织方式问题,并不是别的问题,如果你写一个unsigned long a = 0x1234,其内存数据依次为:0x34,0x12,所以0x34对应的就是a 的地址,如果你转换成unsigned char 后,则第一个字符值必为0x34,下一个为0x12
回复
janic716 2012-04-21
程序按小端模式编写,但不幸的是,飞思卡尔的单片机是大端模式!
回复
ustczjr 2012-04-20
[Quote=引用 35 楼 的回复:]

不好意思说错
[/Quote]
呵呵~
回复
ustczjr 2012-04-20
[Quote=引用 33 楼 的回复:]

在VS2008里跟踪了下内存,有两点发现:1.unsigned char m[4] = {0x83, 0x34, 0x83, 0x4f},m的内存为8334834f。2.unsigned long ccpLastSeed = 0x4f833483(这个是数学表示,非内存表现), ccpLastSeed 的内存为8343834f。所以我有个想法,楼主的ccpLastSeed 在内存中刚好是4f8……
[/Quote]
哦,原来如此,在此谢过~
回复
zhuxiaojing_507 2012-04-20
不好意思说错
回复
zhuxiaojing_507 2012-04-20
void ccpCommand(unsigned char *com )
{
unsigned char a[4]; //用于观察形参的值是否正确

a[0]=com[2];
a[1]=com[3];
a[2]=com[4];
a[3]=com[5];

ccp.ProtectionStatus |= ccpUnlock(&com[2]);

}

函数中调用的ccpUnlock函数定义如下:

unsigned char ccpUnlock( unsigned char *key )
{
unsigned long temp;

ccpLastSeed = 0x4f833483; // 这又是什么 unsigned log?

temp = *(unsigned long *)key; //根据你传入的 key 只是 一个 * unsigned char, 由短变长不是补0的吗,补0还能相等?

if ( temp != ccpLastSeed )
{
return 0;
}

return 1;
}
刚开始我就一直看不明白你什么意思
回复
ustczjr 2012-04-19
[Quote=引用 31 楼 的回复:]

你的程序是不是双字节对齐的
[/Quote]

亲,我不太明白你的意思。。。你具体是指?
回复
phinecos 2012-04-19
在VS2008里跟踪了下内存,有两点发现:1.unsigned char m[4] = {0x83, 0x34, 0x83, 0x4f},m的内存为8334834f。2.unsigned long ccpLastSeed = 0x4f833483(这个是数学表示,非内存表现), ccpLastSeed 的内存为8343834f。所以我有个想法,楼主的ccpLastSeed 在内存中刚好是4f83348d,而不是8334834f(听说有些机器上高低位是相反的,呵呵)
回复
tan8520 2012-04-18
你的程序是不是双字节对齐的
回复
nice_cxf 2012-04-16
[Quote=引用 23 楼 的回复:]

引用 21 楼 的回复:

很奇怪了,unsigned char ccpUnlock( unsigned char *key )
里面先打印一下key的前4个值都是什么如果都是0,那就是调用函数的问题了


亲,能详细点拨一下么?
[/Quote]
unsigned char a[4]; //用于观察形参的值是否正确

a[0]=key[0];
a[1]=key[1];
a[2]=key[2];
a[3]=key[3];
观看a的值是不是正确;
或者
for (int i =0;i<4;i++)
{
int value =key[i];
printf("i=%d,value=%d",i,value);
}
printf("\n");
回复
ustczjr 2012-04-16
[Quote=引用 22 楼 的回复:]

代码因该没问题 因该是高低位的问题,有些平台和x86上高低字节是相反的
[/Quote]

亲,我读的形参是0x0000ef00,跟0x4f833483一点关系都木有哦~可能不是高低位的问题哦~
回复
ustczjr 2012-04-16
[Quote=引用 24 楼 的回复:]

引用 21 楼 的回复:

很奇怪了,unsigned char ccpUnlock( unsigned char *key )
里面先打印一下key的前4个值都是什么如果都是0,那就是调用函数的问题了

看看你那个平台的编译器文档,是不是有什么地方比较特殊,和一般PC机不一样。
[/Quote]
好的,现在来看看。
回复
[Quote=引用 21 楼 的回复:]

很奇怪了,unsigned char ccpUnlock( unsigned char *key )
里面先打印一下key的前4个值都是什么如果都是0,那就是调用函数的问题了
[/Quote]
看看你那个平台的编译器文档,是不是有什么地方比较特殊,和一般PC机不一样。
回复
ustczjr 2012-04-16
[Quote=引用 21 楼 的回复:]

很奇怪了,unsigned char ccpUnlock( unsigned char *key )
里面先打印一下key的前4个值都是什么如果都是0,那就是调用函数的问题了
[/Quote]

亲,能详细点拨一下么?
回复
Red_angelX 2012-04-16
代码因该没问题 因该是高低位的问题,有些平台和x86上高低字节是相反的
回复
nice_cxf 2012-04-16
很奇怪了,unsigned char ccpUnlock( unsigned char *key )
里面先打印一下key的前4个值都是什么如果都是0,那就是调用函数的问题了
回复
加载更多回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2012-04-16 09:22
社区公告
暂无公告