求下面这段代码的注释和流程图,尽可能的详细一些,实在是有些看不懂啊~(„ಡωಡ„)栓Q
#include <REG52.H>
#include <string.h>
#include "lcd1602.h"
#include "delay.h"
#include "key_m.h"
#include "password.h"
#include "buzzer.h"
#include "RC522.h"
#include "eeprom.h"
#include "stepMoto.h"
#define PW_MODE_INPUT 1//ÊäÈëÃÜÂë¿ªËøÄ£Ê½
#define PW_MODE_REGIST 2//×¢²áÐÂÃÜÂëģʽ
#define IC_REGIST 3//IC×¢²á
#define IC_DELETE 4//ICɾ³ý
unsigned char IC_SN[3][4]={0};//´æ·ÅÓû§µÄIC¿¨ÐòÁкÅ
u8 openDoor=0;
u8 saveEEPROM=0;
void Dis_ICcode(u8* _IC);
u8 Search_IC(u8 *_IC);
void Save_IC(u8 _ID,u8 *_IC);
u8 Find_hole_InLib(void);
void Delelt_ID_inLib(u8 _ID);
unsigned char USRT_key;
void main(void)//Ö÷º¯ÊýÈë¿Ú
{
u8 mode;
u8 key;
u8 i;
u8 sta;
u8 err=0;
delay_Init();
LCD_Init();
PW_Init(); //¸´Î»³õʼÃÜÂë
Beep(200);
Start:
mode = PW_MODE_INPUT;
LCD_Clear();
LCD_GotoXY(0x00,0);
LCD_Print("RFID PWord. Lock");
LCD_GotoXY(0x00,1);
LCD_Print("----------------");
Motor1_Stop();
while(1)//Ö÷Ñ»·
{
delay_ms(1);
key = KeyScan(0);
if(key==0)
{
key = USRT_key;
USRT_key = 0;
}
if(key)
{
Beep(200);
if(key=='*')
{
mode = IC_REGIST;//IC¿¨×¢²á
LCD_GotoXY(0x00,0);
LCD_Print(" Regist IC code ");
}
else if(key=='#')
{
mode = IC_DELETE;//ICɾ³ý
LCD_GotoXY(0x00,0);
LCD_Print(" delete IC code ");
}
else if(mode==PW_MODE_INPUT)//ÊäÈëÃÜÂëģʽ
{
switch (InputPassword(key))
{
case 0xFF://ÌØÈ¨ÃÜÂëÕýÈ·
err = 0;
mode=PW_MODE_REGIST;//½øÈë¼Èëģʽ
LCD_GotoXY(0x00,0);
LCD_Print(" Enter a new PW.");
LCD_GotoXY(0x00,1);
LCD_Print("----------------");
break;
case 0x0F://Óû§ÃÜÂë
openDoor=1;
err = 0;
break;
case 0xEE://ÃÜÂë´íÎó
LCD_GotoXY(0x0,1);
LCD_Print(" PassWord error ");
Beep(200);Beep(200);Beep(200);
delay_ms(500);
err++;
goto Start;
break;
default:
break;
}
}
else if(mode==PW_MODE_REGIST)//¼ÈëÃÜÂëģʽ
{
sta=SetPassword(key);
LCD_GotoXY(0x00,0);
if(sta)
{
if(sta==0xF1)LCD_Print("Set PW.->[24C02]");
if(sta==0xF2)LCD_Print("Set PW.->[Flash]");
if((sta>>4)==0x0E)LCD_Print("*Set PW. Error* ");
Beep(200);
Beep(200);
delay_ms(400);
mode = PW_MODE_INPUT;//»Øµ½ÊäÈëģʽ
goto Start;
}
}
}
else if((mode==PW_MODE_INPUT)||(mode==IC_REGIST)||(mode==IC_DELETE))
{
if(ReadICcode(buf)==0)
{
Dis_ICcode(buf);
Beep(200);
delay_ms(400);
sta=Search_IC(buf);
if(mode==PW_MODE_INPUT)
{
if(sta==0xEE)//ÐÂIC¿¨
{
err++;
openDoor = 0;
LCD_GotoXY(0x0,1);
LCD_Print(" IC code error ");
Beep(100);Beep(100);Beep(100);
delay_ms(1500);
goto Start;
}
else
{
openDoor = 1;
err = 0;
}
}
if(mode==IC_REGIST)
{
if(sta==0xEE)//ÐÂIC¿¨
{
sta = Find_hole_InLib();//ÔÚÊý¾Ý¿âÖÐÕÒµ½Ò»¸ö¿ÕλÖÃ
if(sta!=0xEE)
{
Save_IC(sta,buf); //´æÔÚÕâ¸ö¿ÕλÖÃÉÏ
saveEEPROM=1;
LCD_GotoXY(0x0,1);
LCD_Print("Add IC Code OK ");
Beep(500);
}
else
{
LCD_GotoXY(0x0,1);
LCD_Print("Library Is Full ");
Beep(200);Beep(200);Beep(200);
}
}
else
{
LCD_GotoXY(0x0,1);
LCD_Print("IC Already Store");
Beep(200);Beep(200);Beep(200);
}
delay_ms(500);
goto Start;
}
if(mode==IC_DELETE)
{
if(sta==0xEE)//ÐÂIC¿¨
{
LCD_GotoXY(0x0,1);
LCD_Print("Delete Code ERR");
Beep(200);Beep(200);Beep(200);
}
else
{
sta=Search_IC(buf);
Delelt_ID_inLib(sta);
saveEEPROM=1;
LCD_GotoXY(0x0,1);
LCD_Print("Delete Code OK ");
Beep(500);
delay_ms(400);
}
delay_ms(500);
goto Start;
}
}
}
if(openDoor)
{
openDoor=0;
LCD_GotoXY(0x0,1);
LCD_Print("Opening the door");
//Relay=0;
buzzer = 0;
Motor1_Go_F(DEG180);
buzzer = 1;
//Beep(2000);
LCD_GotoXY(0x0,1);
LCD_Print(" Door Is Open ");
delay_ms(1000);
delay_ms(1000);
//Relay=1;
LCD_GotoXY(0x0,1);
LCD_Print("Closing the door");
buzzer = 0;
Motor1_Go_B(DEG180);
buzzer = 1;
LCD_GotoXY(0x0,1);
LCD_Print("----------------");
}
else
Motor1_Stop();
if(err>=3)
{
LCD_GotoXY(0x0,1);
LCD_Print("***Input Lock***");
while(1)
{
delay_ms(150);
buzzer = 0;
delay_ms(150);
buzzer = 1;
}
}
if(saveEEPROM)
{
saveEEPROM = 0;
for(i=0;i<8;i++)
buf[i] = code_PW[i];
for(i=0;i<12;i++)
buf[8+i]=IC_SN[i/4][i%4];
EEPROM_WRITE(buf,20);
}
}
}
void LCD1602_Hex(u8 _hex)
{
u8 temp = _hex>>4;
if(temp>9)LCD_WrDat(temp-10+'A');
else LCD_WrNUM(temp);
temp = _hex&0x0F;
if(temp>9)LCD_WrDat(temp-10+'A');
else LCD_WrNUM(temp);
}
void Dis_ICcode(u8* _IC)//ÏÔʾ16½øÖÆIC¿¨ºÅ
{
//"0123456789abcdef"
//"IC:78 FB A8 01 "
LCD_GotoXY(0x0,1);
LCD_Print("IC: ");
LCD_GotoXY(0x3,1);
LCD1602_Hex(_IC[0]);
LCD_GotoXY(0x6,1);
LCD1602_Hex(_IC[1]);
LCD_GotoXY(0x9,1);
LCD1602_Hex(_IC[2]);
LCD_GotoXY(0xC,1);
LCD1602_Hex(_IC[3]);
}
u8 Search_IC(u8 *_IC)//ËÑË÷IC¿¨£¬·µ»ØIDºÅ
{
u8 i;
for(i=0;i<3;i++)
{
if((_IC[0]==IC_SN[i][0])
&&(_IC[1]==IC_SN[i][1])
&&(_IC[2]==IC_SN[i][2])
&&(_IC[3]==IC_SN[i][3]))
{
return i;
}
}
return 0xEE;
}
void Save_IC(u8 _ID,u8 *_IC)
{
u8 i;
for(i=0;i<4;i++)
{
IC_SN[_ID][i] = _IC[i];
}
}
u8 Find_hole_InLib(void)//ËÑË÷¿ÕÏÐλÖÃ
{
u8 IC_hole[4]={0};
return Search_IC(IC_hole);
}
void Delelt_ID_inLib(u8 _ID)//ɾ³ýIDλÖõĿ¨ºÅ
{
u8 IC_hole[4]={0};
Save_IC(_ID,IC_hole) ;
}
#include <REG52.H> // 引用51单片机寄存器定义头文件
#include <string.h> // 引用字符串操作库头文件
#include "lcd1602.h" // 引用LCD1602驱动库头文件
#include "delay.h" // 引用延时库头文件
#include "key_m.h" // 引用矩阵键盘驱动库头文件
#include "password.h" // 引用密码控制库头文件
#include "buzzer.h" // 引用蜂鸣器控制库头文件
#include "RC522.h" // 引用RC522射频模块控制库头文件
#include "eeprom.h" // 引用EEPROM读写库头文件
#include "stepMoto.h" // 引用步进电机控制库头文件
#define PW_MODE_INPUT 1 // 定义密码输入模式为1
#define PW_MODE_REGIST 2 // 定义密码设置模式为2
#define IC_REGIST 3 // 定义IC卡添加模式为3
#define IC_DELETE 4 // 定义IC卡删除模式为4
unsigned char IC_SN[3][4]={0}; // 定义一个存储用户的IC卡序列号的3x4二维数组
u8 openDoor=0; // 定义一个判断门是否打开的标志位
u8 saveEEPROM=0; // 定义一个标志,表示是否需要保存到EPROM
void Dis_ICcode(u8* _IC);
u8 Search_IC(u8 *_IC);
void Save_IC(u8 _ID,u8 *_IC);
u8 Find_hole_InLib(void);
void Delelt_ID_inLib(u8 _ID);
unsigned char USRT_key;
void main(void) // 主函数入口
{
// 变量声明和初始化
u8 mode; // 定义模式变量
u8 key;
u8 i;
u8 sta;
u8 err=0;
// 初始化操作
delay_Init(); // 延时初始化
LCD_Init(); // LCD1602初始化
PW_Init(); // 密码控制初始化
Beep(200); // 蜂鸣器提示音
Start: // 标记,便于跳转回来
mode = PW_MODE_INPUT; // 初始为密码输入模式
LCD_Clear(); // 清屏
LCD_GotoXY(0x00,0);
LCD_Print("RFID PWord. Lock"); // 第一行显示标题
LCD_GotoXY(0x00,1);
LCD_Print("----------------"); // 第二行分隔线
Motor1_Stop(); // 步进电机停止
// 主循环
while(1)
{
delay_ms(1); // 延时1毫秒
key = KeyScan(0); // 扫描键盘
if(key==0) // 没有扫描到按键
{
key = USRT_key; // 获取串口接收到的键值
USRT_key = 0;
}
if(key) // 如果扫描到按键或者串口接收到键值
{
Beep(200); // 按键提示音
if(key=='*') // 如果输入*,则进入IC卡添加模式
{
mode = IC_REGIST;
LCD_GotoXY(0x00,0);
LCD_Print(" Regist IC code ");
}
else if(key=='#') // 如果输入#,则进入IC卡删除模式
{
mode = IC_DELETE;
LCD_GotoXY(0x00,0);
LCD_Print(" delete IC code ");
}
else if(mode==PW_MODE_INPUT) // 如果在密码输入模式下
{
switch (InputPassword(key))
{
case 0xFF: // 如果检测到按下的键是确认键,则切换到密码设置模式
err = 0;
mode=PW_MODE_REGIST;
LCD_GotoXY(0x00,0);
LCD_Print(" Enter a new PW.");
LCD_GotoXY(0x00,1);
LCD_Print("----------------");
break;
case 0x0F: // 如果检测到按下的键是用户密码,则标志位openDoor为1,代表允许开门
openDoor=1;
err = 0;
break;
case 0xEE: // 如果检测到按下的键是错误密码,则提示密码错误并发出警报声,同时记录错误次数
LCD_GotoXY(0x0,1);
LCD_Print(" PassWord error ");
Beep(200);Beep(200);Beep(200);
delay_ms(500);
err++;
goto Start; // 跳转到标记Start开始处
break;
default:
break;
}
}
else if(mode==PW_MODE_REGIST) // 如果在密码设置模式下
{
sta=SetPassword(key); // 调用设置密码函数
LCD_GotoXY(0x00,0);
if(sta) // 如果设置密码成功
{
if(sta==0xF1)LCD_Print("Set PW.->[24C02]");
if(sta==0xF2)LCD_Print("Set PW.->[Flash]");
if((sta>>4)==0x0E)LCD_Print("*Set PW. Error* ");
Beep(200);
Beep(200);
delay_ms(400);
mode = PW_MODE_INPUT;
goto Start;
}
}
}
else if((mode==PW_MODE_INPUT)||(mode==IC_REGIST)||(mode==IC_DELETE)) // 如果没有按键输入并且在以下模式下
{
if(ReadICcode(buf)==0) // 判断是否检测到了IC卡
{
Dis_ICcode(buf); // 显示IC卡号
Beep(200);
delay_ms(400);
sta=Search_IC(buf); // 检索IC卡是否存在于用户列表中
if(mode==PW_MODE_INPUT) // 如果在密码输入模式下
{
if(sta==0xEE)// 新卡
{
err++;
openDoor = 0;
LCD_GotoXY(0x0,1);
LCD_Print(" IC code error ");
Beep(100);Beep(100);Beep(100);
delay_ms(1500);
goto Start;
}
else // 老卡
{
openDoor = 1;
err = 0;
}
}
if(mode==IC_REGIST) // 如果在IC卡添加模式下
{
if(sta==0xEE)// 新卡
{
sta = Find_hole_InLib();
if (sta != 0xEE) // 如果状态不为 0xEE(非空位置)
{
Save_IC(sta, buf); // 将 IC 序列号保存在指定的 ID 号位置
saveEEPROM = 1; // 设置保存 EEPROM 标志为 1,表示需要保存数据到 EEPROM
LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
LCD_Print("Add IC Code OK "); // 显示 "Add IC Code OK" 第二行
Beep(500); // 发出长蜂鸣声提示操作成功
}
else // 如果状态为 0xEE(空位置)
{
LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
LCD_Print("Library Is Full "); // 显示 "Library Is Full" 第二行
Beep(200); // 发出短蜂鸣声提示库满
Beep(200);
Beep(200);
}
}
else
{
LCD_GotoXY(0x0,1);
LCD_Print("IC Already Store");
Beep(200);Beep(200);Beep(200); // 播放蜂鸣声,表示IC已经存储
}
delay_ms(500);
goto Start; // 跳转到标签Start,继续下一轮循环
}
if (mode == IC_DELETE)
{
if (sta == 0xEE) // 如果状态为 0xEE(新 IC)
{
LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
LCD_Print("Delete Code ERR"); // 显示 "Delete Code ERR" 第二行
Beep(200); // 发出短蜂鸣声提示操作错误
Beep(200);
Beep(200);
}
else
{
sta = Search_IC(buf); // 搜索指定的 IC 序列号在库中的位置
Delelt_ID_inLib(sta); // 删除指定 ID 号位置的 IC 序列号
saveEEPROM = 1; // 设置保存 EEPROM 标志为 1,表示需要保存数据到 EEPROM
LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
LCD_Print("Delete Code OK "); // 显示 "Delete Code OK" 第二行
Beep(500); // 发出长蜂鸣声提示操作成功
delay_ms(400); // 延时 400ms
}
delay_ms(500); // 延时 500ms
goto Start; // 跳转到程序入口处
}
}
}
if (openDoor)
{
openDoor = 0; // 将开门标志重置为 0
LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
LCD_Print("Opening the door"); // 显示 "Opening the door" 第二行
//Relay=0;
buzzer = 0; // 关闭蜂鸣器
Motor1_Go_F(DEG180); // 电机正转180度
buzzer = 1; // 打开蜂鸣器
//Beep(2000);
LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
LCD_Print(" Door Is Open "); // 显示 " Door Is Open " 第二行
delay_ms(1000); // 延时 1000ms
delay_ms(1000); // 延时 1000ms
//Relay=1;
LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
LCD_Print("Closing the door"); // 显示 "Closing the door" 第二行
buzzer = 0; // 关闭蜂鸣器
Motor1_Go_B(DEG180); // 电机反转180度
buzzer = 1; // 打开蜂鸣器
LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
LCD_Print("----------------"); // 显示 "----------------" 第二行
}
else
Motor1_Stop(); // 停止电机运动
if (err >= 3)
{
LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
LCD_Print("***Input Lock***"); // 显示 "***Input Lock***" 第二行
while (1)
{
delay_ms(150); // 延时 150ms
buzzer = 0; // 关闭蜂鸣器
delay_ms(150); // 延时 150ms
buzzer = 1; // 打开蜂鸣器
}
}
if (saveEEPROM)
{
saveEEPROM = 0; // 将保存 EEPROM 标志重置为 0
for (i = 0; i < 8; i++)
buf[i] = code_PW[i]; // 将 code_PW 数组中的数据拷贝到 buf 数组的前 8 个元素中
for (i = 0; i < 12; i++)
buf[8 + i] = IC_SN[i / 4][i % 4]; // 将 IC_SN 数组中的数据拷贝到 buf 数组的后 12 个元素中
EEPROM_WRITE(buf, 20); // 将 buf 数组中的数据写入 EEPROM
}
}
}
void LCD1602_Hex(u8 _hex)
{
u8 temp = _hex >> 4; // 取高4位
if (temp > 9)
LCD_WrDat(temp - 10 + 'A'); // 如果大于9,显示对应的字母
else
LCD_WrNUM(temp); // 否则显示数字
temp = _hex & 0x0F; // 取低4位
if (temp > 9)
LCD_WrDat(temp - 10 + 'A'); // 如果大于9,显示对应的字母
else
LCD_WrNUM(temp); // 否则显示数字
}
void Dis_ICcode(u8* _IC)//显示16位十六进制IC号
{
//"0123456789abcdef"
//"IC:78 FB A8 01 "
LCD_GotoXY(0x0,1); // 将光标设置在第二行开头
LCD_Print("IC: "); // 显示 "IC: " 第二行
LCD_GotoXY(0x3,1); // 将光标设置在第二行第四个字符处
LCD1602_Hex(_IC[0]); // 显示_IC[0]的十六进制值
LCD_GotoXY(0x6,1); // 将光标设置在第二行第七个字符处
LCD1602_Hex(_IC[1]); // 显示_IC[1]的十六进制值
LCD_GotoXY(0x9,1); // 将光标设置在第二行第十个字符处
LCD1602_Hex(_IC[2]); // 显示_IC[2]的十六进制值
LCD_GotoXY(0xC,1); // 将光标设置在第二行第十三个字符处
LCD1602_Hex(_IC[3]); // 显示_IC[3]的十六进制值
}
u8 Search_IC(u8 *_IC)//查找IC号,返回ID号
{
u8 i;
for (i = 0; i < 3; i++)
{
if ((_IC[0] == IC_SN[i][0])
&& (_IC[1] == IC_SN[i][1])
&& (_IC[2] == IC_SN[i][2])
&& (_IC[3] == IC_SN[i][3]))
{
return i; // 返回ID号
}
}
return 0xEE; // 未找到匹配的IC号,返回0xEE
}
void Save_IC(u8 _ID, u8 *_IC)
{
u8 i;
for (i = 0; i < 4; i++)
{
IC_SN[_ID][i] = _IC[i]; // 将_IC的数据保存到IC_SN数组中对应ID号的位置
}
}
u8 Find_hole_InLib(void)//查找空闲位置
{
u8 IC_hole[4] = {0}; // 定义一个全零的IC号
return Search_IC(IC_hole); // 返回查找结果
}
void Delelt_ID_inLib(u8 _ID)//删除ID位置的IC号
{
u8 IC_hole[4] = {0}; // 定义一个全零的IC号
Save_IC(_ID, IC_hole); // 将全零的IC号保存到ID位置
}
你好,还有哪里看不懂的么,可以针对性在给你指点一下,楼上的注释清清楚楚了。就是一些状态机的思想,按键那里切状态切来切去的。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这是一个基于单片机的RFID密码锁系统,主要是通过读取RFID模块的数据来进行用户身份验证。以下是代码注释和流程图:
注释:
定义了一些库文件和常量(如密码输入和注册模式、IC卡注册和删除等)以及存储用户IC卡的数组IC_SN。
main函数进入后初始化程序并进入开始标签Start。
进入主循环,不断扫描按键输入,如果是数字键,会根据当前模式分别执行相应操作(如输入密码、IC卡注册、IC卡删除等)。如果没有按键输入,则会读取RFID模块的数据并进行身份验证,如果验证通过则开锁。
如果输入错误次数超过3次,则系统会进入锁死状态。
如果用户进行了IC卡注册或删除操作,则程序会将IC_SN数组存储的数据写入EEPROM中。
流程图:
程序中的主循环由以下流程组成:
扫描按键输入:通过KeyScan函数来检测是否按下数字键,并读取键值。
操作模式判断:根据当前模式(密码输入/注册、IC卡注册、IC卡删除)执行相应操作。
IC卡识别验证:调用ReadICCode函数读取RFID模块数据,并与IC_SN数组进行比较以验证身份。
根据验证结果开锁或报错:如果验证通过则开锁,否则根据错误次数进行相应提示和处理。
IC卡注册/删除操作:如果用户进行了IC卡注册或删除操作,则更新IC_SN数组中的对应数据并写入EEPROM。
循环结束时停止步进电机并等待下一次循环开始。
注意:由于缺少代码中的其他函数库文件和变量定义,以上注释和流程图可能不完全准确,仅为给出参考。
如果我的回答解决了您的问题,请采纳!
1、C语言和汇编的区别(汇编完全对应机器操作,C对应逻辑操作)
(1)C语言叫高级语言,汇编语言叫低级语言。
(2)低级语言的意思是汇编语言和机器操作相对应,汇编语言只是CPU的机器码的助记符,用汇编语言写程序必须拥有机器的思维。因为不同的CPU设计时指令集差异很大,因此用汇编编程的差异很大。
(3)高级语言(C语言)它对低级语言进行了封装(C语言的编译器来完成),给程序员提供了一个靠近人类思维的一些语法特征,人类不用过于考虑机器原理,而可以按照自己的逻辑原理来编程。譬如数组、结构体、指针····
(4)更高级的语言如java、C#等只是进一步强化了C语言提供的人性化的操作语法,在易用性上、安全性上进行了提升。
2、C语言的一些“小动作”
(1)高级语言中有一些元素(如运算符等)是机器中没有的
(2)高级语言在运算中允许我们大跨度的运算。意思就是低级语言中需要好几步才能完成的一个运算,在高级语言中只要一步即可完成。譬如C语言中一个变量i要加1,在C中只需要i++即可,看起来只有一句代码。但实际上翻译到汇编阶段需要3步才能完成:第1步从内存中读取i到寄存器,第2步对寄存器中的i进行加1,第3步将加1后的i写回内存中的i。
3、使用临时变量来理解强制类型转换
4、使用临时变量来理解不同数据类型之间的运算
#include <stdio.h>
int main(void)
{
int b;
float a;
b = 10;
a = b / 3; // 第一步先算 b/3,第二步将第一步的结果强制类型转换为float生成一个临时变量,第三步将第二步生成的临时变量赋值给a,第四步销毁临时变量。
printf("a = %f.\n", a);
/*
int b;
float a, f;
b = 10;
f = 1.5;
a = b / f;
printf("a = %f.\n", a);
*/
/*
float a = 12.34;
int b = (int)a; // a被强制类型转换后自己本身竟然没变
// (int)a强制类型转换并赋值在底层实际分了4个步骤:第一步先在另外的地方找一个内存构建一个临时变量x(x的类型是int,x的值等于a的整数部分),第二步将float a的值的整数部分赋值给x,第三步将x赋值给b,第四步销毁x。
// 最后结果:a还是float而且值保持不变,b是a的整数部分。
printf("a = %f, b = %d.\n", a, b);
*/
return 0;
}