当前位置:文档之家› 身份证阅读器动态库应用函数的定义格式、调用方法和返回值的说明

身份证阅读器动态库应用函数的定义格式、调用方法和返回值的说明

身份证阅读器动态库应用函数的定义格式、调用方法和返回值的说明
身份证阅读器动态库应用函数的定义格式、调用方法和返回值的说明

华视电子读写设备有限公司

本手册是操作身份证阅读器动态库应用函数的定义格式、调用方法和返回值的说明。在使用前,请确认授权文件termb.lic是否在你的PC机C:\根目录下。

1. 定义

应用函数开发包含下列文件:

termb.dll API函数的动态联接库

sdtapi.dll 内部动态库

cvrapi.dll 内部动态库

wltrs.dll 内部动态库

termb.lic 身份证相片解压授权文件,放于C:\目录下

适用操作系统:

Windows NT: 需要NT 3.1版或以后版本

Windows: 需要 Windows 98、Windows 2000或以后版本

适用开发语言:

Visual C++ 5.0 及以后版本

Visual Basic 5.0 及以后版本

Delphi 3.0 及以后版本

PowerBuilder 6.0 及以后版本

2. 函数列表

//以下为主要API函数

int CVR_InitComm(int Port) 初始化连接;

int CVR_Authenticate() 卡认证;

int CVR_Read_Content(int Active) 读卡操作。

int CVR_CloseComm() 关闭连接;

//以下为可选API函数,方便二次开发

int CVR_Ant(int mode) 射频操作

int CVR_ReadBaseMsg (

unsigned char *pucCHMsg, unsigned int *puiCHMsgLen, unsigned char *pucPHMsg, unsigned int *puiPHMsgLen,

int nMode) 读卡操作(读入内存)

int GetPeopleName(char *strTmp, int *strLen) 得到姓名信息

int GetPeopleSex(char *strTmp, int *strLen) 得到性别信息

int GetPeopleNation(char *strTmp, int *strLen) 得到民族信息

int GetPeopleBirthday(char *strTmp, int *strLen) 得到出生日期

int GetPeopleAddress(char *strTmp, int *strLen) 得到地址信息

int GetPeopleIDCode(char *strTmp, int *strLen) 得到身份证号信息

int GetDepartment(char *strTmp, int *strLen) 得到发证机关信息

int GetStartDate(char *strTmp, int *strLen) 得到有效开始日期

int GetEndDate(char *strTmp, int *strLen) 得到有效截止日期

3. 函数调用流程

.函数说明

4.1初

始化连接

原型:int CVR_InitComm (int Port)

说明:本函数用于PC与华视电子第二代居民身份证阅读器的连接。

参数:Port:连接串口(COM1~COM16)或USB口(1001~1016)

返回值:

4.2关闭串口

原型:

int CVR_CloseComm(void)

说明:本函数用于关闭PC到阅读器的连接。

参数:无

返回值:

4.3卡认证

原型:int CVR_Authenticate (void)

说明:本函数用于读卡器和卡片之间的合法身份确认。卡认证循环间隔大于300ms。

参数:

返回值:

注意:若卡片放置后发生认证错误时,应移走卡片重新放置。

4.4读卡操作

原型:int CVR_Read_Content(int Active);

说明:本函数用于通过阅读器从第二代居民身份证中读取相应信息。卡认证成功以后才可做读卡操作,读卡完毕若继续读卡应移走二代证卡片重新放置做卡认证。

参数:Active 读取信息类型

返回值:

4.5射频操作

原型:int CVR_Ant(int mode);

说明:本函数用于打开/关闭射频。阅读器在不读卡时,如果射频对其它的电子产品有干扰的话,可以选择关闭射频,当需要读卡时,再

打开射频。该函数只在当连接到串行接口的阅读器时,调用有效。

如不调用此函数时,射频一直处于打开状态。

注:当CVR_InitComm函数调用成功后,该函数有效。

参数:mode

返回值:

4.6读文字、照片信息到自定义内存缓冲

原型:int CVR_ReadBaseMsg (unsigned char *pucCHMsg, unsigned int

*puiCHMsgLen, unsigned char *pucPHMsg, unsigned int *puiPHMsgLen,

int nMode)

说明:此函数代替CVR_Read_Content函数,将身份信息读到自定义内存缓冲中。卡认证CVR_Authenticate成功以后调用本函数。

参数:

返回值:

4.7读各项文字信息到自定义内存缓冲

原型:

int _stdcall GetPeopleName(char *strTmp, int *strLen) //得到姓名信息int _stdcall GetPeopleSex(char *strTmp, int *strLen) //得到性别信息

int _stdcall GetPeopleNation(char *strTmp, int *strLen) //得到民族信息

int _stdcall GetPeopleBirthday(char *strTmp, int *strLen) //得到出生日期int _stdcall GetPeopleAddress(char *strTmp, int *strLen) //得到地址信息int _stdcall GetPeopleIDCode(char *strTmp, int *strLen) //得到卡号信息int _stdcall GetDepartment(char *strTmp, int *strLen) //得到发证机关信息

int _stdcall GetStartDate(char *strTmp, int *strLen) //得到有效开始日期

int _stdcall GetEndDate(char *strTmp, int *strLen) //得到有效截止日期

说明:以上函数调用流程为:调用CVR_Read_Content 或者

CVR_ReadBaseMsg 函数成功后再分别调用以上函数。

CVR_Read_Content 或者CVR_ReadBaseMsg 函数自动在应用程序当前目录产生BMP照片文件。

参数:

*strTmp 返回的信息缓存指针。

*strLen 返回的信息长度指针。

返回值:

注意:若采用查询方式自动判断卡片是否放置,则间隔时间建议大于300ms。

注意:

1、读完基本信息后,若需要立即读取最新住址信息或芯片管理号,在未移走卡

片的情况下可以不用卡认证;

2、单独读取最新住址信息或芯片管理号时,需要先进行卡认证;

3、若卡片放置后发生读卡错误时,应移走卡片重新放置。

文字信息采用GB 13000的UCS-2进行存储,各项目分配如下:

芯片管理号分配如下:

function CVR_InitComm(const Port:integer):integer; stdcall; external 'termb.dll';

function CVR_Authenticate():integer; stdcall; external 'termb.dll';

function CVR_Read_Content(const Active:integer):integer; stdcall; external 'termb.dll';

function CVR_CloseComm():integer; stdcall; external 'termb.dll';

function CVR_Ant(const mode:integer):integer; stdcall; external 'termb.dll';

function CVR_ReadBaseMsg(const pucCHMsg:pchar ;const puiCHMsgLen:Longint;const nMode:integer):integer; stdcall; external 'termb.dll';

function GetPeopleName(const strTmp:pchar;const strLen:integer):integer; stdcall; external 'termb.dll';

function GetPeopleSex(const strTmp:pchar;const strLen:integer):integer; stdcall; external 'termb.dll';

function GetPeopleNation(const strTmp:pchar;const strLen:integer):integer; stdcall; external 'termb.dll';

function GetPeopleBirthday(const strTmp:pchar;const strLen:integer):integer; stdcall; external 'termb.dll';

function GetPeopleAddress(const strTmp:pchar;const strLen:integer):integer; stdcall; external 'termb.dll';

function GetPeopleIDCode(const strTmp:pchar;const strLen:integer):integer; stdcall; external 'termb.dll';

function GetDepartment(const strTmp:pchar;const strLen:integer):integer; stdcall; external 'termb.dll';

function GetStartDate(const strTmp:pchar;const strLen:integer):integer; stdcall; external 'termb.dll';

function GetEndDate(const strTmp:pchar;const strLen:integer):integer; stdcall; external 'termb.dll';

宏定义的作用

宏定义的作用 宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、 条件编译 编辑本段1.不带参数的宏定义: 宏定义又称为宏代换、宏替换,简称“宏”。 格式: #define 标识符字符串 其中的标识符就是所谓的符号常量,也称为“宏名”。 预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。 掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要 “换”。 即在对相关命令或语句的含义和功能作具体分析之前就要换: 例: #define PI 3.1415926 把程序中出现的PI全部换成3.1415926 说明: (1)宏名一般用大写 (2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例 如:数组大小常用宏定义 (3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法 检查。 (4)宏定义末尾不加分号; (5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。 (6)可以用#undef命令终止宏定义的作用域 (7)宏定义可以嵌套 (8)字符串" "中永远不包含宏 (9)宏定义不分配内存,变量定义分配内存。 编辑本段2.带参数的宏定义: 除了一般的字符串替换,还要做参数代换 格式: #define 宏名(参数表)字符串 例如:#define S(a,b) a*b area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2; 类似于函数调用,有一个哑实结合的过程: (1)实参如果是表达式容易出问题 #define S(r) r*r area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b; 正确的宏定义是#define S(r) ((r)*(r)) (2)宏名和参数的括号间不能有空格 (3)宏替换只作替换,不做计算,不做表达式求解 (4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内 存 (5)宏的哑实结合不存在类型,也没有类型转换。

C语言宏定义#define

C语言宏定义#define 一、数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎。它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了;也可以把任何东西定义成宏。因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙。看例子: #define PI 3.141592654 在此后的代码中你尽可以使用PI 来代替3.141592654,而且你最好就这么做。不然的话,如果我要把PI 的精度再提高一些,你是否愿意一个一个的去修改这串数呢?你能保证不漏不出错?而使用PI 的话,我们却只需要修改一次。这种情况还不是最要命的,我们再看一个例子: #define ERROR_POWEROFF -1 如果你在代码里不用ERROR_POWEROFF 这个宏而用-1,尤其在函数返回错误代码的时候(往往一个开发一个系统需要定义很多错误代码)。肯怕上帝都无法知道-1 表示的是什么意思吧。这个-1,我们一般称为“魔鬼数”,上帝遇到它也会发狂的。所以,我奉劝你代码里一定不要出现“魔鬼数”。 第一章我们详细讨论了const 这个关键字,我们知道const 修饰的数据是有类型的,而define 宏定义的数据没有类型。为了安全,我建议你以后在定义一些宏常数的时候用const代替,编译器会给const 修饰的只读变量做类型校验,减少错误的可能。但一定要注意const修饰的不是常量而是readonly 的变量,const 修饰的只读变量不能用来作为定义数组的维数,也不能放在case 关键字后面。 二、字符串宏常量 除了定义宏常数之外,经常还用来定义字符串,尤其是路径: A),#define ENG_PA TH_1 E:\English\listen_to_this\listen_to_this_3 B),#define ENG_PATH_2 “E:\English\listen_to_this\listen_to_this_3” 噢,到底哪一个正确呢?如果路径太长,一行写下来比较别扭怎么办?用反斜杠接续符啊:C), #define ENG_PA TH_3 E:\English\listen_to_this\listen\_to_this_3 还没发现问题?这里用了4 个反斜杠,到底哪个是接续符?回去看看接续符反斜杠。 反斜杠作为接续符时,在本行其后面不能再有任何字符,空格都不行。所以,只有最后一个反斜杠才是接续符。至于A)和B),那要看你怎么用了,既然define 宏只是简单的替换,那给ENG_PATH_1 加上双引号不就成了:“ENG_PA TH_1”。 但是请注意:有的系统里规定路径的要用双反斜杠“\\”,比如: #define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3 三、用define 宏定义注释符号? 上面对define 的使用都很简单,再看看下面的例子: #define BSC // #define BMC /*

身份证编码知识

身份证编码知识 我国旧的身份证号码有15位数,新的身份证号码有18位数,新增的三个数在第7、8、18三位. 18位身份证号码的前两位分别表示省、自治区或直辖市.3、4两位表示所在的市,5、6两位表示所在的县区.第7—14位表示出生年月日.第15、16位表示所在地派出所的代码,第17位表示性别,一般男的用奇数表示,女的用偶数表示.第18位表示校验码,由前面17个数经过一定的计算得到,普遍采用计算机自动生成. 目前中国警方开始研究把基因位点编码技术引进居民身份证编码,身份证编码中增加18个数字以表明个人的基因信息.考虑到中国加入WTO后,警方对公民的身份管理方式与国际接轨,其中10个数字代表国际通用的位点,另8个是中国人特有的基因位点.数字下面还隐藏着特殊处理过的DNA指纹防伪条码.全世界60亿人中,同时出生或姓名一致、长相相似、声音相同的人都可能存在,只有基因才是代表人遗传特性、永不改变的特征.身份证上有18个国际通用的基因位点,它们是在人体细胞的遗传信息携带者DNA分子的长链上选取的.这18个基因位点的组合,在100亿人口中没有任何两个人是完全一样的.每个人出生时,由医院提供基因信息,集中到公安部身份管理中心统一编码,通过封闭的系统线路供各级公安机关使用. 基因编码在身份管理系统中是唯一的.虚假的身份资料,在公安部的身份管理中心,是没有对应的基因编码备案的.即使电脑黑客在身份管理系统中建立假的原始身份档案,由于基因编码数据库与因特网分开,他获得不了基因编码,就无法伪造出完整的身份证;丢失身份证的人,在补办时需要进行基因验证,这可以保证身份证的唯一性;对于去世的人,警方将从管理系统中删除此人的基因编码,那么当身份管理系统再发现这个基因编码时,就会发出警告,从而防止死者的身份证被不法分子盗用. - 1 -

函数返回值

函数返回值 1.不带返回值的函数:return; 不带返回值的函数的返回类型为void,这样的函数会在函数的最后一个语句完成时隐式调用return;也可以在函数的结尾显式地调用return; 对于任意一个函数,只要执行了return语句,函数就强制结束了。 对于返回类型为void的函数,如果不显式地调用return;则只有在函数结束时才会隐式调用。可以在函数执行的某一阶段,显式地调用return;来结束函数,不再执行return语句之后的函数部分。 由于break语句只能用于循环和switch语句中,因此,想要结束if语句直接退出函数,可用return; 只有一种情况下,返回类型为void的函数可以使用return expression这一形式,那就是返回另一个返回类型同样是void的函数的调用结果。 如: void A() void B() { { .... .... .... .... return; return A(); } }//因为A返回类型为void,所以可以这样调用。 2.具有返回值的函数:return expression; 代码: int max(int x,int y) #include { int main() int z; { if(x>=y) int a,b,c; z=x; scanf("%d%d",&a,&b); else c=max(a,b); z=y; printf("%d\n",c); return z; return 0; } } 在main函数中调用max函数,函数调用语句为max(a,b); 仔细研究一下max(a,b)。 对于一个表达式来说,它要完成一定的功能,还要返回一个操作结果(即表达式的值)。如i++,它的功能是使变量i的值加1,它的值是i自增前的值。同样的,函数调用也同样如此:max(a,b)的功能是把实参a,b的值传递给形参并执行函数中的各个语句;max(a,b)的值是一个int类型的值。 ++i的值是i自增后的值,相当于i=i+1,return i;对于i++来说,它的值是i自增前的值,那么如何获得这个值呢?编译器是这样做的:编译器自动创建一个临时变量并用i自增前的值来初始化这个临时变量。用这个临时变量的值来作为i++这个表达式的值。 同样的,执行max(a,b)后,首先完成参数传递并执行函数max中的各条语句。接着创建一个int型的临时变量并用return expression中expression的值来初始化这个临时变量。临时变量的类型为函数的返回值类型,即函数名之前的类型名。对max()函数来说就是int。

函数参数返回值总结

函数的参数、返回值总结 (一)参数 ◆函数分: 有参函数:函数名(实参列表) 无参函数:函数名() ◆有参函数调用语句中的实参应与被调函数中的形参在个数、类型、顺序上一致。 ◆参数传递时,实参向形参一一对应进行单向的值传递。值:可是数值(变量或数 组元素)或数值的地址值(指针或数组名)。 (二)返回值 函数的返回值即为函数调用后的结果,可有如下返回结果的方法: (1)通过return语句返回一个值; (2)利用地址做参数返回一个或多个值; (3)利用全局变量返回一个或多个值。 (三)例 1、170页实验内容(1):打印由正三角和倒三角组成的图形。 有一个参数,无返回值。实参向形参传递一个数值。 #include /* 有一个参数,无返回值的函数,打印正三角 */ void f1(int n) /* 形参只能是变量,用来接收实参传来的数值 */ { int i,j,k; for(k=1;k<=n;k++) {for(i=1;i<=10-k;i++) printf(" "); for(j=1;j<=k;j++) printf(" *"); printf("\n");} } /* 有一个参数,无返回值的函数,打印倒三角*/ void f2(int n) {int i,j,k; for(k=n;k>=1;k--) {for(i=1;i<=10-k;i++) printf(" "); for(j=1;j<=k;j++) printf(" *"); /*双引号内应为“空格加半角星号”*/ printf("\n");} } main() { int n; scanf("%d",&n);

Excel宏函数

Excel宏函数 [ 2011-02-28 14:27:55 ] 标签:无阅读对象:所有人 Microsoft Excel是一个多功能的电子表格应用程序,组织成列和行的数据多种形式。该方案还提供了分析数据的功能强大的设置后,输入。在单元公式以及菜单选项可以很容易地进行计算,排序和电子表格上的资料相符。在该计划的最强大的能力是可以选择建立的宏。这些都是在Excel中设计使用Visual Basic(V BA)的语言课程。 VBA函数构成任何Excel宏的基石。 数值函数 许多用户在Excel依靠其庞大的数学函数库。宏程序员可以利用数值函数的VBA 进行舍入和截断等共同任务。函数“回合”允许一个宏程序简单一轮任何一个E xcel网格数目增加或减少某一特定小数位。如果一个数的功能部分应该被忽略,而不是完全删除,在“诠释”功能截断的数字。三角函数,如“仙”,“余弦”和“谈”使人们有可能创造在一个宏观的几何计算。一个数字的绝对值可以来自于“绝对”的功能。这些共同的数学函数很容易集成到任何Excel宏为任何应用数值计算。 财政职能 Microsoft Excel是由于其之间的财务职能的扩展库金融专业人士的欢迎。它可以使用在Excel宏这些函数来创建快捷和方便的金融计算器。函数“何首乌”计算的贷款金额在其本金,利息率和付款时间表的基础。类似的是“Ipmt”功能,它使用相同的参数只返回一个贷款支付的利息部分。函数“NPER函数”可以确定所需的款项总数还清给予其主要价值,利率和偿还贷款的安排。的“抗体”的功能决定了未来的投资价值相同的变量为基础。这些功能可以快速生成复杂的公式,没有建设手动有用的财务数据。 文本函数 虽然Excel是一个用于操作数字数据的好工具,它也提供了字符串函数处理文本

C语言函数说明与返回值

C语言函数说明与返回值 在学习C语言函数以前,我们需要了解什么是模块化程序设计方法。 人们在求解一个复杂问题时,通常采用的是逐步分解、分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分为若干功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块像搭积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。 在C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现C语言程序。 利用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性,而且还可以把程序中普通用到的一些计算或操作编成通用的函数,以供随时调用,这样可以大大地减轻程序员的代码工作量。 函数是C语言的基本构件,是所有程序活动的舞台。函数的一般形式是: type-specifier function_name(parameter list) parameter declarations { body of the function } 类型说明符定义了函数中return语句返回值的类型,该返回值可以是任何有效类型。如果没有类型说明符出现,函数返回一个整型值。参数表是一个用逗号分隔的变量表,当函数被调用时这些变量接收调用参数的值。一个函数可以没有参数,这时函数表是空的。但即使没有参数,括号仍然是必须要有的。参数说明段定义了其中参数的类型。

当一个函数没有明确说明类型时, C语言的编译程序自动将整型( i n t)作为这个函数的缺省类型,缺省类型适用于很大一部分函数。当有必要返回其它类型数据时,需要分两步处理: 首先,必须给函数以明确的类型说明符;其次,函数类型的说明必须处于对它的首次调用之前。只有这样,C编译程序才能为返回非整型的值的函数生成正确代码。 4.1.1 函数的类型说明 可将函数说明为返回任何一种合法的C语言数据类型。 类型说明符告诉编译程序它返回什么类型的数据。这个信息对于程序能否正确运行关系极大,因为不同的数据有不同的长度和内部表示。 返回非整型数据的函数被使用之前,必须把它的类型向程序的其余部分说明。若不这样做,C语言的编译程序就认为函数是返回整型数据的函数,调用点又在函数类型说明之前,编译程序就会对调用生成错误代码。为了防止上述问题的出现,必须使用一个特别的说明语句,通知编译程序这个函数返回什么值。下例示出了这种方法。 第一个函数的类型说明sum()函数返回浮点类型的数据。这个说明使编译程序能够对sum( ) 的调用产生正确代码。 函数类型说明语句的一般形式是: type_specifier function_name (; ) 即使函数使用形参,也不要将其写入说明句。若未使用类型说明语句,函数返回的数据类型可能与调用者所要求的不一致,其结果是难以预料的。如果两者同处于一个文件中,编译程序可以发现该错误并停止编译。如果不在同一个文件中,编译程序无法发现这种错误。类型检查仅在编译中进行,链接和运行时均不检查。因此,必须十分细心以确保绝不发生上

VBA函数返回值

VBA之函数返回值 1.返回一个值 Function define_yy(ByVal names As String, ByVal workbooks As String) As String Dim str_return As String '返回值 Dim i, t As Integer ........ ........ ........ ........ ........ define_yy = str_return End Function 对于函数返回值的要点已经用粗体表示出来了.调用此函数的格式为: call modle_connection.define_yy() (这个是不需要返回值的调用方法) bb=modle_connection.define_yy(a,b) (这是需要返回值的方法) 注:modle_connection为程序块名 2.返回值为多个值,可以采用返回数组的类型 Function return_data(ByVal strSEL As String, ByRef x As Integer) As String() '需要有括号,代表数组 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim bb(1000, 20) As String Dim i As Integer, j As Integer cn.Open strCN rs.Open strSEL, cn i = 1 Do While Not rs.EOF If x = 1 Then bb(i, 1) = rs(0) Else For j = 1 To x bb(i, j) = rs(j - 1) Next j End If i = i + 1 rs.MoveNext Loop x = i - 1 return_data = bb() 'BB()本身也需要定义为数组

define宏定义中的#,##,@#及符号

d efine宏定义中的#,##,@#及\符号(ZT) C++ STL学习2011-04-24 18:04:03 阅读19 评论0 字号:大中小订阅 1、# (stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 如: #define example(instr) printf("the input string is:\t%s\n",#instr) #define example1(instr) #instr 当使用该宏定义时: example(abc);在编译时将会展开成:printf("the input string is:\t%s\n","abc"); string str=example1(abc);将会展成:string str="abc"; 注意: 对空格的处理 a。忽略传入参数名前面和后面的空格。 如:str=example1( abc );将会被扩展成str="abc"; b.当传入参数名间存在空格时,编译器将会自动连接各个子字符串,用每个子字符串中只以一个空格连接,忽略其中多余一个的空格。

如:str=exapme( abc def); 将会被扩展成str="abc def"; 2、## (token-pasting)符号连接操作符 宏定义中:参数名,即为形参,如#define sum(a,b) (a+b);中a和b 均为某一参数的代表符号,即形式参数。 而##的作用则是将宏定义的多个形参成一个实际参数名。 如: #define exampleNum(n) num##n int num9=9; 使用: int num=exampleNum(9); 将会扩展成int num=num9; 注意: 1.当用##连接形参时,##前后的空格可有可无。 如:#define exampleNum(n) num ## n 相当于#define exampleNum(n) num##n 2.连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义 // preprocessor_token_pasting.cpp

身份证编码规则

身份证编码规则 一、编码规则: 根据中华人民共和国国家有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码,可以用字母表示如为ABCDEFYYYYMMDDXXXR。其含义如下: 1. 地址码(ABCDEF):表示编码对象常住户口所在县(市、旗、区)的行政区划代码。 2. 出生日期码(YYYYMMDD):表示编码对象出生的年、月、日,分别用4位、2位(不足两位加0)、2位(不足两位加0)数字表示,之间不用分隔符。 3. 顺序码(XXX):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 4.校验码(R),一位数字,通过前17位数字根据一定计算得出。 二、关于地址码含义的详细解释: 身份证前六位是地区代码,我们用ABCDEF表示。代码的解释规则如下: A 国内区域: 1 华北三省二市 2 东北三省 3 华东六省一 4 华南六省 5 西南四省一市 6 西北五省 7 台湾 8 港澳 B或者说是AB,就是前2位:省(直辖市,自治区,特别行政区)代码按照A划定的分区定义省代码,有直辖市的,直辖市列前,其余按离直辖市的距离排序,没有直辖市的,按离北京的远近排序。 具体省(直辖市,自治区,特别行政区)代码如下:11-15 京津冀晋21-23 辽吉黑 31-37 沪苏浙皖闽赣鲁 41-46 豫鄂湘粤桂琼50-54 渝川贵云藏 61-65 陕甘青宁新 81-82 港澳 CD城市代码:从01开始排,对于直辖市,CD=01表示市辖区,CD=02表示辖县;省的城市代码从省会开始排,比如2101=沈阳 2102=大连…… 只有地级城市有独立的城市代码,县级市没有。 EF:市辖区、郊区、郊县、县级市代码:如果EF=00,指代这个城市,不特定区县;对于非直辖市,如EF=01,指代市辖区(任意一个区),02开始指代特定的区。其中:E=0代表市辖区 E=1代表郊区 E=2代表郊县 E=8代表县级市对于直辖市,从01开始就依次排区,没有市区和郊区的代码区分。 三、生日期码(YYYYMMDD): 表示编码对象出生的年、月、日,分别用4位、2位(不足两位加0)、2位(不足两位加0)数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。

函数练习题(C语言)带答案

C语言函数练习题 一、选择题 1. 一个完整的C源程序是【】。 A)要由一个主函数或一个以上的非主函数构成 B)由一个且仅由一个主函数和零个以上的非主函数构成 C)要由一个主函数和一个以上的非主函数构成 D)由一个且只有一个主函数或多个非主函数构成 2. 以下关于函数的叙述中正确的是【】。 A)C语言程序将从源程序中第一个函数开始执行 B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行 C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束 D)main可作为用户标识符,用以定义任意一个函数 3. 以下关于函数的叙述中不正确的是【】。 A)C程序是函数的集合,包括标准库函数和用户自定义函数 B)在C语言程序中,被调用的函数必须在main函数中定义 C)在C语言程序中,函数的定义不能嵌套 D)在C语言程序中,函数的调用可以嵌套 4. 在一个C程序中,【】。 A)main函数必须出现在所有函数之前 B)main函数可以在任何地方出现 C)main函数必须出现在所有函数之后 D)main函数必须出现在固定位置 5. 若在C语言中未说明函数的类型,则系统默认该函数的数据类型是【】 A)float B)long C)int D)double 6. 以下关于函数叙述中,错误的是【】。 A)函数未被调用时,系统将不为形参分配内存单元 B)实参与形参的个数应相等,且实参与形参的类型必须对应一致 C)当形参是变量时,实参可以是常量、变量或表达式 D)形参可以是常量、变量或表达式 7. C程序中各函数之间可以通过多种方式传递数据,下列不能用于实现数据传递的方式是 【】。 A)参数的形实结合 B)函数返回值 C)全局变量 D)同名的局部变量 8. 若函数调用时参数为基本数据类型的变量,以下叙述正确的是【】。 A)实参与其对应的形参共占存储单元 B)只有当实参与其对应的形参同名时才共占存储单元 C)实参与对应的形参分别占用不同的存储单元 D)实参将数据传递给形参后,立即释放原先占用的存储单元

C宏定义

C/C++中宏使用总结 .C/C++中宏总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程 序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C语言预处理程序包括下列命令: #define,#error,#i nclude,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。 1、#define 命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏 替换。命令的一般形式为: #define identifier string 注意: ? 该语句没有分号。在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。 ? 宏名定义后,即可成为其它宏名定义中的一部分。 ? 宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。例如:#define XYZ this is a test,使用宏printf("XYZ");//该段不打印"this is a test"而打印"XYZ"。因为预编译器识 别出的是"XYZ" ? 如果串长于一行,可以在该行末尾用一反斜杠' \'续行。

2、#error 处理器命令#error强迫编译程序停止编译,主要用于程序调试。 3、#i nclude 命令#i nclude使编译程序将另一源文件嵌入带有#i nclude的源文件,被读入的源文件必须用双引号或尖括号括起来。例如: #i nclude"stdio.h"或者#i nclude 这两行代码均使用C编译程序读入并编译用于处理磁盘文件库的子程序。 将文件嵌入#i nclude命令中的文件内是可行的,这种方式称为嵌套的嵌入文件,嵌套层次依赖于具体实现。 如果显式路径名为文件标识符的一部分,则仅在哪些子目录中搜索被嵌入文件。否则,如果文件名用双引号括起来,则首先检索当前工作目录。如果未发现文件, 则在命令行中说明的所有目录中搜索。如果仍未发现文件,则搜索实现时定义的标准目录。 如果没有显式路径名且文件名被尖括号括起来,则首先在编译命令行中的目录内检索。 如果文件没找到,则检索标准目录,不检索当前工作目录。 4、条件编译命令 有几个命令可对程序源代码的各部分有选择地进行编译,该过程称为条件编译。商业软件公司广泛应用条件编译来提供和维护某一程序的许多顾客版本。 #if、#else,#elif及#endif

第二代身份证编码规则 原理剖析及相关代码

第二代身份证编码规则原理剖析及相 关代码 18身份证号码编码规则一、身份证号码执行标准:18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版, 其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。二、编码规则:公民 身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从 左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一 位校验码,可以用字母表示如为ABCDEFYYYYMMDDXXXR。其含义如下:1.地址码(ABCDEF):表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按 GB/T2260的规定执行。2.出生日期码(YYYYMMDD):表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位(不足两位加0)、 2(同上)位数字表示,之间不用分隔符。3.顺序码(XXX):表示在同一地址码所 标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇 数分配给男性,偶数分配给女性。4.校验码(R),一位数字,通过前17位数字 根据一定计算得出。三、关于地址码含义的详细解释:身份证前六位是地区代码,我们用ABCDEF表示。代码的解释规则如下:A:国内区域1华北三省二市 2东北三省3华东六省一市4华南六省5西南四省一市6西北五省7台湾8港 澳B(或者说是AB,就是前2位):省(直辖市,自治区,特别行政区)代码按照 A划定的分区定义省代码,有直辖市的,直辖市列前,其余按离直辖市的距离 排序,没有直辖市的,按离北京的远近排序。具体省(直辖市,自治区,特别行政区)代码如下:11-15京津冀晋蒙21-23辽吉黑31-37沪苏浙皖闽赣鲁41-46 豫鄂湘粤桂琼50-54渝川贵云藏61-65陕甘青宁新81-82港澳CD:城市代码从01开始排,对于直辖市,CD=01表示市辖区,CD=02表示辖县;省的城市代码 从省会开始排,比如2101=沈阳2102=大连…只有地级城市有独立的城市代码,县级市没有。EF:市辖区、郊区、郊县、县级市代码如果EF=00,指代这个城市,不特定区县;对于非直辖市,如EF=01,指代市辖区(任意一个区),02开 始指代特定的区。其中:E=0代表市辖区,E=1代表郊区,E=2代表郊县,E=8

事件处理函数中返回值

事件处理函数中返回值 事件处理函数返回值其实指当事件发生时,浏览器会执行默认的操作,而当事件处理函数会返回一个结果,而当这个结果为true时,浏览器会继续执行默认操作,否则会停止执行。如果还是不懂的话,我们看一下下面这个实例: 当点击超链接标签时,如果check()的值为true,那么浏览器会跳转到abc.html页面中去,如果check()的值为false,点击超链接标签就不会跳转 这里return其实是对事件对象中的returnValue属性值的设置,而该属性就决定了该事件操作是否继续操作,当retrunValue为true时则继续操作,为false时则中断操作。 然而直接执行函数check,不使用return返回将不会对eturnvalue进行设置所以会默认地继续执行操作,比如如下实例 上面的实例就是不管check()的结果是true还是fasle,浏览器都会跳转到abc.html 页面中去。所以必须使用return返回。 事件处理函数返回值在表单中也存在这种情况,如下图

判断用户名是否为空,如果为空就不提交表单,否则就提交表单...跟上面理解是一样的。 讲到这里有很多同学在这里还能理解,但是呢,换个地方,换个事件绑定方式就不能理解了。 比如:在DOM对象上绑定事件: 很多人不能理解的是:在html元素上绑定事件时,return用了两次,才能阻止表单的提交,为什么在DOM对象上绑定事件时只用了一次return就能阻止表单提交,这里我们就要看看为什么了。 我们看看直接打印btn.onclick的结果,发现我们在html元素上绑定的事件处理函数fn是出现在DOM对象上事件处理函数的里面。 所以onclick=”return fn()”等价于 btn.onclick=function(){ return fn() },而fn()的结果true/false就决定表单是否提交。 总结:事件函数返回值; 如果返回true或者不返回,浏览器执行默认操作; 如果返回false,阻止浏览器默认操作。

C语言宏定义##连接符和#符的使用

C语言宏定义##连接符和#符的使用 C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念)。下面对常遇到的宏的使用问题做了简单总结。 关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: #define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #EXP "/n"); } while(0) 那么实际使用中会出现下面所示的替换过程: WARN_IF (divider == 0); 被替换为 do { if (divider == 0) fprintf(stderr, "Warning" "divider == 0" "/n"); } while(0); 这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。 而##被称为连接符(concatenator),用来将两个T oken连接为一个Token。注意这里连接的对象是T oken就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那么下面的代码就非常实用: struct command { char * name; void (*function) (void); }; #define COMMAND(NAME) { NAME, NAME ## _command }

c中各类宏定义的用法

假设a.h内容如下: #ifndef AH #define AH typedef int INT; #endif b.h内容如下: #include "a.h" a.c内容如下: #include "a.h" #include "b.h" main() { INT a; } (1)如果a.h中不写#ifndef #define ... #endif的话 a.c展开结果会是下面这样: typedef int INT; typedef int INT; main() { INT a; } 编译结果会报标识符INT重复错误。 (2)如果a.h中加上#ifndef #define ... #endif的话 a.c展开结果会是下面这样: #ifndef AH #define AH

typedef int INT; #endif #ifndef AH #define AH typedef int INT; #endif main() { INT a; } 这样的话,因为程序中已经定义了一次AH,所以不会走到第二次声明INT的分支。所以不会出错。 #ifndef #define #endif的用法整理:shichenghua https://www.doczj.com/doc/9717161601.html,/blog/?56085/action_viewspace_itemid_1145.htm l (前段时间要到这个,感觉shichenghua整理得不错,所以收藏到此处,若不同意,随时可以撤下 谢谢shichenghua) 文件中的#ifndef

头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的: #ifndef <标识> #define <标识> ...... ...... #endif <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h #ifndef _STDIO_H_ #define _STDIO_H_ ...... #endif 2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。 #ifndef AAA #define AAA ... int i; ... #endif 里面有一个变量定义 在vc中链接时就出现了i重复定义的错误,而在c中成功编译。 结论:

全国各地区身份证代码大全

代码名称110000 市 110100 市市辖区110101 市东城区110102 市西城区110103 市崇文区110104 市宣武区110105 市区110106 市丰台区110107 市石景山区110108 市海淀区110109 市门头沟区110111 市房山区110112 市通州区110113 市顺义区110114 市昌平区110115 市大兴区110116 市怀柔区110117 市平谷区110200 市县110228 市密云县110229 市延庆县120000 市 120100 市市辖区120101 市和平区120102 市河东区120103 市河西区120104 市南开区120105 市区120106 市红桥区120107 市塘沽区120108 市汉沽区120109 市大港区120110 市东丽区120111 市西青区120112 市津南区120113 市北辰区120114 市武清区120115 市宝坻区120200 市县120221 市宁河县120223 市静海县120225 市蓟县130000 省 130100 省市 130101 省市市辖区130102 省市长安区130103 省市桥东区130104 省市桥西区130105 省市新华区130107 省市井陉矿区130108 省市裕华区130121 省市井陉县130123 省市正定县130124 省市栾城县130125 省市行唐县130126 省市灵寿县130127 省市高邑县130128 省市深泽县130129 省市赞皇县130130 省市无极县130131 省市平山县130132 省市元氏县130133 省市县130181 省市辛集市130182 省市藁城市130183 省市晋州市130184 省市新乐市130185 省市鹿泉市130200 省市 130201 省市市辖区130202 省市路南区130203 省市路北区130204 省市古冶区130205 省市开平区130207 省市丰南区130208 省市丰润区130223 省市滦县130224 省市滦南县130225 省市乐亭县130227 省市迁西县130229 省市玉田县130230 省市唐海县130281 省市遵化市130283 省市迁安市130300 省市 130301 省市市辖区

Qt全局变量、函数和宏定义详解

头文件包含了 Qt 类库的一些全局定义,包括基本数据类型、函数和宏,一般的 Qt 类的头文件都会包含该文件,所以不用显式包含这个头文件也可以使用其中的定义。 全局变量定义 为了确保在各个平台上各数据类型都有统一确定的长度,Qt 为各种常见数据类型定义了类型符号,如 qint8 就是 signed char 的类型定义,即: 中定义的数据类型见表 1。 其中 qreal 缺省是 8 字节 double 类型浮点数,如果 Qt 使用-qreal float 选项进行配置,就是 4 字节 float 类型的浮点数。

qfloat16 是 Qt 5.9.0 中新增的一个类,用于表示 16 位的浮点数,要 使用 qfloat16,需要包含头文件 。 全局函数定义 头文件包含一些常用函数的定义,这些函数多以模板类型作为参数,返回相应的模板类型,模板类型可以用任何其他类型替换。若是以 double 或 float 类型数作为参数的,一般有两个参数版本的同名函数,如qFuzzyIsNull(double d) 和 qFuzzyIsNull(float f)。 表 2 是 中常用的全局函数定义,列出了函数的输入和输出参数(若存在 double 和 float 两种参数版本,只列出 double 类型参数的版本)。

还有一些基础的数学运算函数在 头文件中定义,比如三角运算函数、弧度与角度之间的转换函数等。 全局宏定义 中文件中定义了很多宏,以下一些是比较常用的: ?QT_VERSION:这个宏展开为数值形式 0xMMNNPP (MM = major, NN = minor, PP = patch) 表示 Qt 编译器版本,例如 Qt 编译器版本为 Qt 5.9.1,则 QT_VERSION 为 0x050901。这个宏常用于条件编译设置,根据 Qt 版本不同,编译不同的代码段。 ?QT_VERSION_CHECK:这个宏展开为 Qt 版本号的一个整数表示,例如: ?QT_VERSION_STR:这个宏展开为 Qt 版本号的字符串,如“5.9.0”。 ?Q_BYTE_ORDER、Q_BIG_ENDIAN 和 Q_LITTLE_ENDIAN:Q_BYTE_ORDER 表示系统内存中数据的字节序,Q_BIG_ENDIAN 表示大端字节序,Q_LITTLE_ ENDIAN 表示小端字节序。在需要判断系统字节序时会用到,例如:

c语言宏定义技巧

1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H // 头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned long int uint32; /* Unsigned 32 bIT value */ typedef unsigned short uint16; /* Unsigned 16 bit value */ typedef unsigned char uint8; /* Unsigned 8 bit value */ typedef signed long int int32; /* Signed 32 bit value */ typedef signed short int16; /* Signed 16 bit value */ typedef signed char int8; /* Signed 8 bit value */ //下面的不建议使用 typedef unsigned char byte; /* Unsigned 8 bit value type. */ typedef unsigned short word; /* Unsinged 16 bit value type. */ typedef unsigned long dword; /* Unsigned 32 bit value type. */ typedef unsigned char uint1; /* Unsigned 8 bit value type. */ typedef unsigned short uint2; /* Unsigned 16 bit value type. */ typedef unsigned long uint4; /* Unsigned 32 bit value type. */ typedef signed char int1; /* Signed 8 bit value type. */ typedef signed short int2; /* Signed 16 bit value type. */ typedef long int int4; /* Signed 32 bit value type. */ typedef signed long sint31; /* Signed 32 bit value */ typedef signed short sint15; /* Signed 16 bit value */ typedef signed char sint7; /* Signed 8 bit value */ 3,得到指定地址上的一个字节或字 #define MEM_B( x ) ( *( (byte *) (x) ) ) #define MEM_W( x ) ( *( (word *) (x) ) ) 4,求最大值和最小值 #define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) ) #define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) ) 5. 得到一个field在结构体(struct)中的偏移量 #define FPOS( type, field ) \ ( (dword) &(( type *) 0)-> field ) 6. 得到一个结构体中field所占用的字节数 #define FSIZ( type, field ) sizeof( ((type *) 0)->field )

相关主题
文本预览
相关文档 最新文档