c语言编程一些小技巧

来源:互联网 发布:java学完能做什么工作 编辑:程序博客网 时间:2024/04/25 13:00

这编博客是为了记录自己编程的心路历程,固件编程一直是自己的短板快哭了,身为一个硬件工程师偏偏经常接到写固件的活,其实我的内心是拒绝的大哭。但是,这想让自己的短板变成平板并不冲突~所以该好好学就好好用功奋斗。总结的只是一些这段时间下来的心得~不喜请轻喷~有什么问题欢迎指出微笑

(以下是基于stm32的编程)

1:

编程中调用其它文件(如.c)中的参数,全局变量会产生相关性,实时改变某一参数,通过调用函数的办法实现。

//******Main.c********//

Task(){

   Set_ip_addr();

}

//******Eth_ip.c*******//

Void set_ip_addr(){

Local_ip_address.m_addr[3] = ReadDip();

}


2:

不同位数变量之间的相互转换,注意存储顺序。

u16 word = 0xabcd1234

u8 *p = (u8 *) &word;

p[0] p[1] p[2] p[3]存储顺序应该是 34 12 cd ab


3:

队列的使用方法之一:

中断函数:参数或数据写入队列->任务函数:从队列取出参数,调用解析数据函数

上面两个函数可写在一个.c函数中。

写义一个struct就是用自己想要的方式来解析一组数据


4:

数组命令匹配调用参数或者函数:

接收命令,调用对应函数

typedef int (*DebugCmdHANDLE) (const char *);     //const只分配一次内存, DebugCmdHANDLE为函数指针

                                                                                  //函数占一段连续的内存区域 函数名被转换为首地址与数组类似

                                                                                  //即函数名可以传递给函数指针                      

                                                                                  //指针函数: int *DebugCmdHANDLE (const char *)   返回值为int指针的函数

 

typedef struct tg_debug_cmd_handle_tab{

char *m_pCmdStr;

DebugCmdHANDLE m_Handel;

char *m_pHelpStr;

} CmdHandleTAB


static const CmdHandleTAB handle_tab[]=   //命令表

{

{“ledon”, ledon_handle, 0},

{“ledoff”, ledoff_handle, 0}

};

const CmdHandleTAB *cmd_handle_tab(void)//命令表要传递出去比较(handle_tab[]),用函数传递相当对外接口,命令表一个文件中,命令表匹配另一个文件

{

Return handle_tab;

}


Int ledon_handle(const char *pData) //调用的函数

{

//

}

//在另一个文件中读取命令表

cmd_line_init(cmd_handle_tab(), cmd_handle_tab_size());


5:

调用原始函数是一个很好的办法,比如atoi();直接将char *所代表的123,转换成了int 的123!


6:

//const 请作为常量使用,并且肯定是个常量 通过指针可修改参数

//volatile 请不要做不靠谱的优化,这值很可能改变掉

//const与volatile并不矛盾

//static

1)函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

7:

int b =1; int *p=&b; int **a=&p;

int **aa表示的是指针的地址,也就是地址(指针所指对向的地址)的地址(指针的地址);*a则表示前一个地址,a则表示后一个地址。

用到int **的情况是需要对指针的地址进行加减操作并且赋值的。


8:

键盘上的ENTER在ASCII中表示 0x0d、13、某些语言中为’\r’。

在linux系统中ENTER用’\n’表示,Windows系统中用”\r\n”两个字符表示。


9:

两个指针间或数组数据的互传

unsigned char pWifiData[20];

memcpy(pWifiData, &pBuf[1], sizeof(pWifiData)); //区别pWifiData = &pBuf[1];这个只传递了一个地址过去,地址+1后面东西会改变