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

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) //第三个参数不对

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


...全文
165 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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[**]穿进去
这个模块之前早就写了的,只是最近一直上班总忘记发,现在已经凌晨四点过了,才下班回来,想起这个模块,发出来大伙瞅瞅。 我们设计好软件界面编译后,如果运行在高DPI的屏幕上,可能存在字体模糊的情况。例如我目前使用的笔记本电脑(感谢某大哥赞助)就是这么个情况,以前写好的软件打开一看,字体模模糊糊的。 如图: 从图中可以看到,软件读取屏幕的DPI也没有读取到正确的缩放比例,正确的应该是125%,而不是图中显示的100%。 要解决字体模糊和正确读取屏幕缩放比例(DPI),我选择的方案是在编译后的软件中设置存根清单来实现。 用到的存根清单设置工具, 此软件我之前有开源过,需要源码自行搜索。 方法:运行这个工具,将需要处理的文件(已编译的EXE可执行文件)拖到这个工具的窗口中,然后勾选DPI感知,最后点击更新即可。 如图: 这样操作以后,软件就能够正确读取到缩放比例,而且界面的字体也变清晰了,随之出现新的问题。 如图: 缩放比例读取正确,字体也清晰了,但是导致的问题是由于字体变大,窗口组件显示不完整了。 这时候就需要用到今天开源的这给个模块 ,附上这个模块的演示源码 。 重点来了,处理程序适应屏幕缩放的解决步骤: 1,在窗口启动事件下,调用该模块的取屏幕缩放比例()命令来获取屏幕缩放比例,判断是否需要缩放窗口组件,如果需要则继续调用适配屏幕缩放()命令,这条命令会根据指定的缩放比例改变指定窗口及其所有窗口组件的尺寸,如果有多个窗口,则每个窗口都需要这样处理。 2,编译您的程序,然后使用存根清单设置工具启用DPI感知选项。 注意:第一个操作是在源码中调用模块并写入适配的代码,第二个操作是对编译后的EXE可执行文件的存根清单进行设置。 完成这两个操作,你的软件就能很好的适配了。 如图: 这只是一个比较笨拙的解决方案,仅供参考! 注意:代码中使用此模块后,还需配合存根清单设置工具使用,如果没有启用DPI感知,则达不到预期的效果!

70,023

社区成员

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

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