编程技巧总结
1、尽量少使用while(1)死循环,可以在init函数中使用g_xxx_quit置为false,然后while(!g_xxx_quit)进行轮询,退出时需要在uninit()函数中将s_quited置为true,退出循环。
2、想要在不同平台执行不同的代码可以使用以下这种方式编写代码。
编写完成后需要在Cmakelist.txt增加定义
ADD_DEFINTIONS(DXXX)
#ifdef QNX
.....
#else
.....
#endif
3、变量命名规则
1)命名全局变量:
staitc 类型 g_xxxx = 0;
g代表global。
2)内部成员变量的命名:
都是以m开头,m代表member的意思,
eg:mMutexPulse;
成员变量
eg:mpArcCalibration;
成员指针
4、回调函数的编写
回调函数的调用主要涉及状态的反馈。
编写步骤如下:
1)在最外部定义好回调函数的具体动作。
eg:void xxxx_cb(void* pUserdata, .....);
2、将定义好的回调函数传入内部,主要通过Init初始化函数传入。
3、一旦有状态更新反馈,就会触发函数内部回调,进入外部的回调函数。
5、初始化相关
1)给结构体赋初值
memset(&变量名, 0, sizeof(变量类型));
2)将一个结构体的内容赋值给另一个结构体(两个结构体)
memcpy(&内部变量名, 外部变量指针, sizeof(变量类型));
3)什么时候指针可以写成数组形式赋值?
给该指针动态分配内存空间;
typedef struct _tag_XCameraEng_InitParam
{
xxx
xxx
ARCCAMERA_PARAM_T* pCamera;
...
}XCAMERAENG_INITPARAM, *LPXCAMERAENG_INITPARAM;
sEngInitParam.pCamera = (ARCCMERA_PARAM_T*)malloc(sEngInitParam.nCameraNum * sizeof(ARCCAMERA_PARAM_T));
sEngInitParam.pCamera[0].xxx = xxxx;
......
sEngInitParam.pCamera[1].xxx = xxxx;
......
sEngInitParam.pCamera[2].xxx = xxxx;
......
sEngInitParam.pCamera[3].xxx = xxxx;
4)当一个动态分配的变量赋值给完另一个变量后,需要马上释放。
res = XAVMEng_Create(&sEngInitParam, &sAvmEngInitParam, &g_pXAVMEng);
if(sEngInitParam.pCamera != 0) {
free(sEngInitParam.pCamera);
sEngInitParam.pCamera = 0;
}
6、错误码的使用
1)MERR_UNKNOW
将参数传到算法中去,返回值不为0,返回该错误码。
2)MERR_INVALID_PARAM
- 当传入的句柄指针为空时,返回该错误码。
- 或者传入的参数不符合参数范围时,返回该错误码。
3)MERR_BAD_STATE
当前状态不符合想要的状态时,返回该错误码。
4)MERR_UNSUPPORTED
当某个属性不支持的时候,返回该错误码。
5)MERR_NO_MEMORY
当内存分配失败,返回该错误码。
eg:
sEngInitParam.pCamera = (ARCCMERA_PARAM_T*)malloc(sEngInitParam.nCameraNum * sizeof(ARCCAMERA_PARAM_T));
if (!sEngInitParam.pCamera) {
LOG_E("memory malloc failed");
return MERR_NO_MEMORY;
}
7、负数如何存储在有符号整数
负数为-2147483648,保存时的时候应该使用有符号整型来进行保存数据。
signed int
用32个字节存储则可以表示为0x80 00 00 00。
二进制可以表示为1000 0000 0000 0000。第一位表示为负数。后面所有位取反加1便可以得到负数值。