微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第53节:指针让一个函数可以封装多个参数

第53节:指针让一个函数可以封装多个参数

时间:11-22 来源:互联网 点击:

,再找到对应的输出变量,这些输出变量就是我们要的结果。

* 在本函数中,被除数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); //把运算结果返

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top