C++之函数形参不能和类成员同名

今天遇到了一个问题:

UDP_Class::UDP_Class(Can_Class * Can_point)
{
	//Can_point = Can_point; 错误
	//形参不能和类的成员同名,
	this->Can_tem_point=Can_point;
}

看上面的UDP_Classl类,我之前定义了一个类的私有成员Can__point,注释部分

	private:
		Action_Class *Action_Obj_tmp;
	  Can_Class * Can_tem_point;
		//Can_Class * Can__point;

然后在构造函数的时候把一个对象的指针赋值到成员。注释部分

然后在UDP的类函数里调用了Can__point对象的函数。
//Can_tem_point原本是Can__point

					case 172:
						//需要等待slave电机回传OK
						if(Can_tem_point->Can_Sendcmd_Data(142,&udp_ReceBuf(0))==0)
						{
							 udp_SendCommOK(0x55);
						}

						break;

再往里走

u8 Can_Class::Can_Sendcmd_Data(u8 miancmd,u8 * udpdata)
{
	static DWORD Can_Wait_Sendback_OK=0;
	u8 status;
	u8 i;
		u8 buf[8]={0,1,2,3,4,5,6,7};
		buf[0] = 142;//142
		buf[1] = udpdata[6];//11
		buf[2] = udpdata[7];//地址低位
		buf[3] = udpdata[8];//地址高位
		buf[4] = udpdata[11];//数据低位
		buf[5] = udpdata[12];//数据高位
		buf[6] = udpdata[9];//数据个数低位
		buf[7] = (udpdata[9]>>8)&0xff;//数据个数高位
		if(Can1_APP.CAN_Send_Msg_M4(buf,FDCAN_DLC_BYTES_8)==1)
		{
			status =1;
		}
		else
		{
			//等待完成
				Can_Wait_Sendback_OK = lwTickCount_M4;
				//等待CPU1修改完成才发送
				while(1)
				{
					//如果在10ms内更新完成就没事
					if((CanBus_RecvBuf[5]!=0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+1000)))
					{
//						for(i=0;i<8;i++)
//							printf("%x ",(CanBus_RecvBuf[i]));
//						printf("\r\n");
						IWDG_Feed_M4();
					}
					//如果在10ms内更新完成就没事
					else if((CanBus_RecvBuf[5]==0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+1000)))
					{
					//	printf("44\r\n");
						status= 0;
						break;
					}
					else if((CanBus_RecvBuf[5]!=0x55)&&(lwTickCount_M4>(Can_Wait_Sendback_OK+1000)))
					{
						//printf("%d\r\n",(CanBus_RecvBuf[5]));
						//printf("5\r\n");
						status= 1;
						CanBus_Alarm=1;
						break;
					}
				}
			}
			return status;
}

这里,是用网络给下位机发指令,然后下位机1又往另一个下位机2发送CAN指令,接着等待返回OK的信号。

这时候奇怪的现象出现了,

另一个下位机2是成功返回了OK信号,下位机1也收到了OK信号,为什么呢,看下面。

extern "C"void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
    u8 i=0;

	//printf("1\r\n");
	//RxFifo0ITs是一个中断的标志位,表示是什么中断,FDCAN 中断寄存器 (FDCAN_IR)
    if((RxFifo0ITs&FDCAN_IT_RX_FIFO0_NEW_MESSAGE)!=RESET)   //FIFO1新数据中断
    {
				
        //提取FIFO0中接收到的数据
        HAL_FDCAN_GetRxMessage(hfdcan,FDCAN_RX_FIFO0,&FDCAN1_RxHeader,Can1_APP.CanBus_RecvBuf);
			
				//RXF0C.F0SA、RXF1C.F1SA 和 RXBC.RBSA,看手册
				Can1_APP.Client_Id = FDCAN1_RxHeader.Identifier;
				Can1_APP.CanBus_Recv_Len = FDCAN1_RxHeader.DataLength>>16;
			
				
        HAL_FDCAN_ActivateNotification(hfdcan,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
				
				if(Can1_APP.Client_Id == Can_Recv_Client_ID)
				{
//					printf("%d\r\n",Can1_APP.CanBus_Recv_Len);
//				
//						printf("%x\r\n",Can1_APP.CanBus_RecvBuf[5]);
						Can1_APP.Can_Recv_Flag =1;
				}
    }
}

我在这个回调函数里打印了数据,确实收到了我想要的数据Can1_APP.CanBus_RecvBuf[5]=0x55.

可是,就是进不了下面这个if

					else if((CanBus_RecvBuf[5]==0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+1000)))
					{
					//	printf("44\r\n");
						status= 0;
						break;
					}

我在这个if打印数据,发现全是一堆毫无关系的数据,都不是另一个下位机2发回来的数据

					if((CanBus_RecvBuf[5]!=0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+5)))
					{
//						for(i=0;i<8;i++)
//							printf("%x ",(CanBus_RecvBuf[i]));
//						printf("\r\n");
						IWDG_Feed_M4();
					}

这时候就奇怪了。我的回调函数里明明收到了数据,而且,这是一个while循环,是不会出去的,但是我在等待期间打印收到的数据确实一堆毫无关系的数据。

后来我把下位机1的程序下载到下位机2,然后就正常了,唯一的不同是,Can_tem_point=Can_point;
这两个不同名。
为什么我会写成不同名,那也是巧合,改回来了。然后都不知道找问题找到什么时候。

UDP_Class::UDP_Class(Can_Class * Can_point)
{
	//Can_point = Can_point; 错误
	//形参不能和类的成员同名,
	this->Can_tem_point=Can_point;
}

可是。我又想不懂为什么,这是什么原理,
在这里插入图片描述
用同名的指针对象函数是可以执行的,就是在里面的while等待的时候CanBus_RecvBuf的数据会出错。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值