论坛元老
 
- 积分
- 4163
- 金钱
- 4163
- 注册时间
- 2017-10-24
- 在线时间
- 251 小时
|
发表于 2018-9-23 11:38:49
|
显示全部楼层
问题一,参考一下函数参数的“按地址传递”和“按值传递”的区别。楼主所写的方式是按值传递,函数参数相当于新开了一个局部变量,进入函数的时候这个局部变量只是简单地按值把实参的值拷贝过来了,在函数的执行过程中,的确rcvd_len被清零了;但是清零的仅仅是这个局部变量,而不是实参的那个rcvd_len。楼主改写成这个样子即可:
[mw_shl_code=c,true]u8 GetUartlen(u8* rcvd_len, u8 len){
if (len > *rcvd_len) //读取长度大于接收到的数据长度时,
{
len = *rcvd_len; //读取长度设置为实际接收到的数据长度
}
*rcvd_len = 0; //清零接收计数器
return len; //返回实际读取长度
}[/mw_shl_code]
在调用的时候,需要顺带修改一下函数实参的写的形式:
[mw_shl_code=c,true]u8 tmp; //假设这个是rcvd_len这个函数形参所对应的实参
u8 len;
len=GetUartlen(&tmp,len); //对应的函数实参要取地址[/mw_shl_code]
这部分的理解,楼主还是要好好学习一下函数中的参数,按值和按地址的区别。
问题二,这个方法是不能的,C语言中不允许直接对结构体“类型”的成员进行操作,直接这样写的话,编译器反而可能会认为stu1是变量。比较合适的做法是使用一个指针,当某个stu1对象呗声明后,让这个指针指向这个stu1的相关成员变量。这个时候就没有必要使用共用体,再声明一个结构体类型是比较方便的。详细的做法可以参考3#
|
|