请大伙帮我看看这个程序,为什么可以编译通过!

Daniel22_cn 2005-12-12 03:43:25
最近在改一个手持POS机的程序,因为也是第一次接触,所以没什么经验!
程序是用C写的,GNU C编译器编译的。

我替换了其中一个头文件,然后出现了很多编译错误,于是就一个个的解决,其中遇到了这样一个问题

#define init_RC530

.....//其他内容

#ifdef init_RC530
void init_RC530_IF(int No)
{
char TempStatus;
if (No==-1)return;
set_console_english();
if( InitMC530(0) != MI_OK)
{
clear_console();
move_cursor(0,0);
printf("RF Card IF error");
return;
}
// ResetAllCard(); // reset all card in the field
// clear_console();
{
char * code_key[] = {"\xff\xff\xff\xff\xff\xff","\xff\xff\xff\xff\xff\xff"};
short sector;
for (sector = 0; sector < 16; sector++)
{
if( Mf500KeyWriteToEeprom(PICC_AUTHENT1A,sector,code_key[No]) == MI_OK)
{
}
else
{
puts("Err");
break;
}
if( Mf500KeyWriteToEeprom(PICC_AUTHENT1B,sector,code_key) == MI_OK)
{
}
else
{
puts("Err");
break;
}
}
};
//InitMC530(0);
//delay_ms(800);
MC530Off();
delay_ms(200);
return;
}
#endif

//可能做过的兄弟,都知道,这个是装载M1卡密码的
其中的函数原型
char Mf500KeyWriteToEeprom(unsigned char key_type,
unsigned char sector,
unsigned char * uncoded_keys
);
在我没有更改之前,他是可以编译通过的,我改了以后编译就提示参数错误
Mf500KeyWriteToEeprom(PICC_AUTHENT1B,sector,code_key) //第三个参数不对

看看,其实第三个参数这样调用应该是不对,也没什么好说的,但是问题是,为什么之前他可以正常编译通过呢?


...全文
155 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
RainWindy 2005-12-12
  • 打赏
  • 举报
回复
char* code_key[] = { NULL, NULL};
少了一个等号
RainWindy 2005-12-12
  • 打赏
  • 举报
回复
char * code_key[] = {"1234567890","abcdefghijk"};

首先是code_key是一个指针数组,就是说code_key本身是一个数组,它是有一个地址的。
code_key[0]是这个指针数组的一个元素,它是指向另一个分配区的,并它的内容是"1234567890"

它们是不同的地址:

你可以考虑这个
char* code_key[] { NULL, NULL};
显然code_key[0]是NULL,而code_key是存在的。

以下是测试程序:
#include <stdio.h>

void main()
{
char * code_key[] = {"1234567890","abcdefghijk"};
printf("%p,%p,%p\n", code_key, code_key[0], code_key[1]);
}

但不知道在你的这个系统中是否这样?
csucdl 2005-12-12
  • 打赏
  • 举报
回复
可以通过吗? 明显类型不一致, code_key 是 char **而函数的参数类型为char*, 除非你强制转换 (reinterpret_cast), 而且你的理解似乎不对, 传递code_key不等于传递参数code_key[0]
Daniel22_cn 2005-12-12
  • 打赏
  • 举报
回复
楼上的兄弟,我没有更改过他的代码,只是加了一个头文件,从头到尾,他都是
if( Mf500KeyWriteToEeprom(PICC_AUTHENT1A,sector,code_key) == MI_OK)//这个,我没有更改过


以前用VC编译器,这样一般默认会被作为错误指出来!!所以,只是警告,正常编译,有点不习惯了!

我的理解,传递进入的参数是code_key[0]。不知道对不对!
Daniel22_cn 2005-12-12
  • 打赏
  • 举报
回复
我已经找到问题了!

GNU C对于这样的问题,编译的时候产生的问题只是警告级别!!

FT。。。仍然可以正常编译!

那么哪位兄弟解释一下,这个时候传递进入函数的值是多少呢?

是code_key[0],还是code_key[1]呢?
RainWindy 2005-12-12
  • 打赏
  • 举报
回复
你是说之前是:
if( Mf500KeyWriteToEeprom(PICC_AUTHENT1A,sector,code_key[No]) == MI_OK)

然后你改成了
if( Mf500KeyWriteToEeprom(PICC_AUTHENT1A,sector,code_key) == MI_OK)
就报错了?

是这样吗?
我们看看定义:
char Mf500KeyWriteToEeprom(unsigned char key_type,
unsigned char sector,
unsigned char * uncoded_keys
);
其中第三个参数是字符指针类型

char * code_key[] = {"\xff\xff\xff\xff\xff\xff","\xff\xff\xff\xff\xff\xff"};

code_key定义的是指针数组类型,直接code_key为参数当然不匹配了。

code_key数据的每一个元素是一个指针,
所以code_key[n]指向一个指针,参数是匹配的。
zhousqy 2005-12-12
  • 打赏
  • 举报
回复
你改了什么
goodluckyxl 2005-12-12
  • 打赏
  • 举报
回复
char Mf500KeyWriteToEeprom(unsigned char key_type,
unsigned char sector,
unsigned char * uncoded_keys
);
// 第三个参数 type: unsigned char *
// code_key 类型 char * code_key[] =
// 改成 code_key[**]穿进去

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧