IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++之函数形参不能和类成员同名 -> 正文阅读

[C++知识库]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的数据会出错。
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:33:09  更:2022-03-13 21:34:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:45:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码