分層
要具有一定的分層意識?。。『瘮?shù)用起來千萬不要瞎調(diào)用,而且不同的硬件之間的連接關(guān)系一定要明確
memcpy處理int類型
拷貝普通的char類型是沒問題的,但是int型就需要仔細(xì)考慮一下了,一個占4位而不是1位;
scanf使用
需要加取地址符?。?!
輕度算法問題
遇到算法問題,一定要思路清晰,先分解問題,單獨構(gòu)造需要的每一個函數(shù),最后再統(tǒng)一調(diào)度
宏定義加U
#define mark01 1u
上述的1u即表示無符號的1,u為unsigned的意思,這種語法應(yīng)該是用于宏定義和運算中居多,定義賦值時通常不用
struct和typedef
struct STUA{
int st1;
} STA;
//STUA為結(jié)構(gòu)體類型名--星體,STA為具體結(jié)構(gòu)體名--地球
typedef struct STUB{
int st2;
} STB;
void main()
{
struct STUA sup1;
struct STUB sup2;
STA supa1;//會報錯,此種方法不可用
STB supb2;//可正常使用
STA.st1 = 1;//可正常使用
STB.st2 = 2;//會報錯
//res = get_area(0,0,1,1,-1,-1,3,3);
printf("%d %d\n ",STA.st1,sup1.st1);
}
typedef的struct在用的時候會有一定的省略,用法也稍有不同
加了typedef的struct STB具有了類似結(jié)構(gòu)體類型名稱的屬性,可以直接用STB supb2的方法來定義,但是不具有了具體結(jié)構(gòu)體名的屬性,不能夠使用STB.st2直接賦值
ifdef三連
#ifndef TRUE
#define TRUE 1
#endif
函數(shù)用作參數(shù)
初步總結(jié)
1.只要用函數(shù)作指針,或要使用函數(shù)作參數(shù),均需要定義一個指針函數(shù),返回值類型和參數(shù)要和實體函數(shù)完全相同,用來在具體使用中(實際主函數(shù)調(diào)用或結(jié)構(gòu)體定義)替代實體函數(shù),通常描述為typedef void (*pfunc)(int a,XXX)
實例如下圖
.h
typedef void (*rec_u)(uint8_t *msg, uint16_t len);//描述函數(shù)參數(shù)類型
.c
static void UDP_Receive(uint8_t *msg, uint16_t len)//函數(shù)實體
{
XXXXX
}
uint32_t CreateSocket(const char *ip, uint16_t port,rec_u readcb)//調(diào)用函數(shù)中的函數(shù)參數(shù)類型描述
{
XXXXX
}
void main()
{
ret = CreateSocket("3.0.4.3", 83, UDP_Receive);//主函數(shù)調(diào)用
}
?。?!如果直接用函數(shù)UDP_Receive()做參數(shù)如下圖
CreateSocket("3.0.4.3", 83, UDP_Receive())
則是用返回值做參數(shù)哦,含義大不一樣
函數(shù)用作結(jié)構(gòu)體內(nèi)容的應(yīng)用描述
.h文件
描述結(jié)構(gòu)體,定義函數(shù)一律用指針類型
typedef void (*rec_r)(T_Mode mode, uint32_t msgId, TUri uri, uint8_t *msg);//指針
typedef void (*rec_u)(uint8_t *msg, uint16_t len);
typedef struct st1
{
uint8_t used;
uint8_t socketId;
uint8_t refId;
uint32_t lifetime;
char udp_ip[16];
uint16_t udp_port;
StRes res[SIZE];
uint8_t res_cnt;
rec1 res_cb;
rec2 udp_cb;
} StNBIoTInstance;
.c文件
實際函數(shù)的參數(shù)要保證和結(jié)構(gòu)體中的函數(shù)體一致,在映射的時候不用帶參數(shù)(直接用函數(shù)名稱賦值)
void func1(T_Mode mode, uint32_t msgId, TUri uri, uint8_t *msg)//定義兩種函數(shù)作參數(shù)形式
{
XXXX
}
void func2(uint8_t *msg, uint16_t len)
{
XXXX
}
void main()//主函數(shù)調(diào)用
{
st1 st;
st.res_r = func1;
st.res_u = func2;
}