第53节:指针让一个函数可以封装多个参数
,再找到对应的输出变量,这些输出变量就是我们要的结果。
* 在本函数中,被除数ucBeiChuShu_1和除数ucChuShu_1就是输入全局变量,
* 商ucShang_1和余数ucYu_1就是输出全局变量。这种方法的缺点是阅读不直观,
* 封装性不强,没有面对用户的输入输出接口,
*/
void chu_fa_yun_suan_1(void)//第1种方法 求商和余数
{
if(ucChuShu_1==0) //如果除数为0,则商和余数都为0
{
ucShang_1=0;
ucYu_1=0;
}
else
{
ucShang_1=ucBeiChuShu_1/ucChuShu_1; //求商
ucYu_1=ucBeiChuShu_1%ucChuShu_1; //求余数
}
}
/* 注释二:
* 第2种方法,用return返回参数和带输入形参的函数,这种方法已经具备了完整的输入和输出性能,
* 比第1种方法直观多了。但是这种方法有它的局限性,因为return只能返回一个变量,
* 如果要用在返回多个输出结果的函数中,就无能为力了。比如本程序,就不能同时输出
* 商和余数,只能分两个函数来做。如果要在一个函数中同时输出商和余数,该怎么办?
* 这个时候就必须用指针了,也就是我下面讲到的第3种方法。
*/
unsigned char get_shang_2(unsigned char ucBeiChuShuTemp,unsigned char ucChuShuTemp) //第2种方法 求商
{
unsigned char ucShangTemp;
if(ucChuShuTemp==0) //如果除数为0,则商为0
{
ucShangTemp=0;
}
else
{
ucShangTemp=ucBeiChuShuTemp/ucChuShuTemp; //求商
}
return ucShangTemp; //返回运算后的结果 商
}
unsigned char get_yu_2(unsigned char ucBeiChuShuTemp,unsigned char ucChuShuTemp) //第2种方法 求余数
{
unsigned char ucYuTemp;
if(ucChuShuTemp==0) //如果除数为0,则余数为0
{
ucYuTemp=0;
}
else
{
ucYuTemp=ucBeiChuShuTemp%ucChuShuTemp; //求余数
}
return ucYuTemp; //返回运算后的结果 余数
}
/* 注释三:
* 第3种方法,用带指针的函数,就可以顺心所欲,不受return的局限,想输出多少个
* 运算结果都可以,赞一个!在本函数中,ucBeiChuShuTemp和ucChuShuTemp是输入变量,
* 它们不是指针,所以不具备输出接口属性。*p_ucShangTemp和*p_ucYuTemp是输出变量,
* 因为它们是指针,所以具备输出接口属性。
*/
void chu_fa_yun_suan_3(unsigned char ucBeiChuShuTemp,unsigned char ucChuShuTemp,unsigned char *p_ucShangTemp,unsigned char *p_ucYuTemp)//第3种方法 求商和余数
{
if(ucChuShuTemp==0) //如果除数为0,则商和余数都为0
{
*p_ucShangTemp=0;
*p_ucYuTemp=0;
}
else
{
*p_ucShangTemp=ucBeiChuShuTemp/ucChuShuTemp; //求商
*p_ucYuTemp=ucBeiChuShuTemp%ucChuShuTemp; //求余数
}
}
void usart_service(void) //串口服务程序,在main函数里
{
if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
{
ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
//下面的代码进入数据协议解析和数据处理的阶段
uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动
while(uiRcregTotal>=5&&uiRcMoveIndex<=(uiRcregTotal-5))
{
if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55) //数据头eb 00 55的判断
{
//第1种运算方法,依靠全局变量
ucBeiChuShu_1=ucRcregBuf[uiRcMoveIndex+3]; //被除数
ucChuShu_1=ucRcregBuf[uiRcMoveIndex+4]; //除数
chu_fa_yun_suan_1(); //调用一次空函数就出结果了,结果保存在ucShang_1和ucYu_1全局变量中
eusart_send(ucShang_1); //把运算结果返回给上位机观察
eusart_send(ucYu_1);//把运算结果返回给上位机观察
//第2种运算方法,依靠两个带return语句的返回函数
ucBeiChuShu_2=ucRcregBuf[uiRcMoveIndex+3]; //被除数
ucChuShu_2=ucRcregBuf[uiRcMoveIndex+4]; //除数
ucShang_2=get_shang_2(ucBeiChuShu_2,ucChuShu_2); //第2种方法 求商
ucYu_2=get_yu_2(ucBeiChuShu_2,ucChuShu_2); //第2种方法 求余数
eusart_send(ucShang_2); //把运算结果返回给上位机观察
eusart_send(ucYu_2);//把运算结果返回给上位机观察
//第3种运算方法,依靠指针
ucBeiChuShu_3=ucRcregBuf[uiRcMoveIndex+3]; //被除数
ucChuShu_3=ucRcregBuf[uiRcMoveIndex+4]; //除数
/* 注释四:
* 注意,由于商和余数是指针形参,我们代入的变量必须带地址符号& 。比如&ucShang_3和&ucYu_3。
* 因为我们是把变量的地址传递进去的。
*/
chu_fa_yun_suan_3(ucBeiChuShu_3,ucChuShu_3,&ucShang_3,&ucYu_3);//第3种方法 求商和余数
eusart_send(ucShang_3); //把运算结果返
指针函数封装语句返回参 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)