.h和.c文件

全局变量定义和声明

报错:
error #10056: symbol "_bChannel" redefined: first defined in "./src/Source/schedule.obj"; redefined in "./src/Source/main.obj"

// 错误:仅在.h中定义并初始化
// .h文件
INT8U g_ucSocketNum = 1;
INT16U g_usTxPort = 8080;
INT8U g_ucChannel = 0;
// .c文件
没有

// 正确:
// (1)全局变量:需要在.h中用extern声明,在.c中定义并初始化,如果是结构体、需要专门写函数初始化。
// .h文件
extern INT8U g_ucSocketNum;
extern INT16U g_usTxPort;
extern INT8U g_ucChannel;
// .c文件
INT8U g_ucSocketNum = 1;
INT16U g_usTxPort = 8080;
INT8U g_ucChannel = 0;

// (2)文件变量:仅仅在.c中使用,只需要在.c中定义并初始化,.h中不用体现。
// .c文件
INT8U ucSocketNum = 1;
INT16U usTxPort = 8080;
INT8U ucChannel = 0;

指针

1、memcpy的参数

报错:
No source available for "0x100100"
TMS320C6713: Error: Memory Map Error: READ access by CPU to address 0x64010000, which is RESERVED in Hardware.

INT16U SocketRev(INT8U bSocketNum, INT8U *bRxdata, INT32U *dwTxIP, INT16U *wTxPort, INT8U bChannel)
{
	INT32S len = 31 + 2 + 256;
	//memcpy(&bRxdata, (void *) 0x80000000, len); // 错误 已经是指针了,就不必再取地址了。
    memcpy(bRxdata, (void *) 0x80000000, len); // 正确
	return 0;
}

2、数组名作为参数传递时,到底带不带&符号?【都可以,为了懒,一般不带】

3、结构体嵌套时,访问成员变量用·而不是->

编译报错:#45 expression must have pointer type
废了好大劲儿才找到问题所在。

// 错误:pstCfkMsg_o->stCfkMsgData->uiCode
memcpy(&pstCfkMsg_o->stCfkMsgData->uiCode, &pucRxBuf_i[index], byteNum);

// 正确:pstCfkMsg_o->stCfkMsgData.uiCode
//	ST_CfkMsgData stCfkMsgData = pstCfkMsg_o->stCfkMsgData; //【不能用局部变量,会导致无法赋值!!!】
// memcpy(&(stCfkMsgData.uiCode), &pucRxBuf_i[index], byteNum);  //一波未平一波又起,找了半天才发现错在这里,为了省事儿在函数中搞了个局部变量stCfkMsgData,结果这里的memcpy并没有修改原始的pstCfkMsg_o->stCfkMsgData。真是醉了,还是不要偷懒了。
memcpy(&(pstCfkMsg_o->stCfkMsgData.uiCode), &pucRxBuf_i[index], byteNum); 

局部变量和全局变量

定义了全局变量,又重复定义了同名局部变量,导致赋值无效

注意:在变量上移到全局时,不要忘了把局部的定义去掉!

void main(){
  INT8U ucCmdH = 0x0;			 // 指令字的高8位
  if (revFlag == BTRUE)
  {
	  ucCmdH = g_stCfkMsgA.stCfkMsgData.ucCfkCmd[1]; 
	  // INT8U ucCmdH = g_stCfkMsgA.stCfkMsgData.ucCfkCmd[1]; //【错误代码】这里重复定义了同名局部变量,实际上是在变量上移时、忘了把定义去掉
  }
  switch (ucCmdH) //错误代码导致,每次到这里,ucCmdH都会清零,气死了,搞了一下午才找到错。
  {
      case 0x10:
	    xxx;
	    break;
	  case 0x20:
        xxx;
        break;
  }
}
posted on 2024-06-19 16:16  西伯尔  阅读(2)  评论(0编辑  收藏  举报