最近工作使用了几个小skills,优化了代码,还帮团队的小伙子搞定了插入排序的功能。现在有些年轻人技术有点不足啊, 一个二分查找插入搞了快一周还没完成, 汗!!!
使用弱类型作为日志开关的妙用
程序存在多个模块,每个模块都是编译成一个单独的静态库,且每个模块都存在日志的打印。 希望可以通过一个地方统一控制不同模块的日志开关。通过在main.c的强符号变量,替换各个模块内的弱符号变量,控制各个不同模块的日志打印。主函数内,通过执行不同的命令变更强符号变量的值, 动态控制不同模块的日志打印。
// module_a
__attribute__(weak) bool module_a_log_enable = false;
#define MODULE_A_LOG(...) do {\
if (module_a_log_enable) {\
logFunc(__VA_ARGS__);\
}\
}\
// module_b
__attribute__(weak) bool module_b_log_enable = false;
#define MODULE_B_LOG(...) do {\
if (module_b_log_enable) {\
logFunc(__VA_ARGS__);\
}\
}\
// main.c
bool module_a_log_enable = true;
bool module_b_log_enable = true;
二分查找与插入算法的运用
接收配置,依据配置id从小到大保存。很简单的二分查找再插入的小程序。
// return 0 exist , insert fail. 1 insert success
int insertData(int *datas, int curDataCount, int newData) {
int min = 0, max = curDataCount - 1;
int middle, i;
// find position
while (min < max) {
middle = (max - min)/2 + min;
if (datas[middle] < newData) {
min = middle + 1;
} else if (datas[middle] == newData) {
return 0;
} else {
max = middle - 1;
}
}
// insert
if (min >= curDataCount) {
datas[curDataCount] = newData;
} else {
if (datas[min] < newData) {
min++;
}
for (i = count; i > min; i--) {
datas[i] = datas[i - 1];
}
datas[min] = newData;
}
return 1;
}
穷举二维数组的排列组合
有一个二维数组 a[n][m], 0 < n, m <= 8.每行的有效元素个数不固定,且单行内的元素不重复。 要求从每一行取一个有效数字,组成一个一维数组result[n]。 计算出所有可能的组合。
算法: 使用递归, 依次选取第0,1, ... n行的元素,直到第n+1行结束, 每行都有column[n]个选择方法。
void select(int *a[8], int rowCount, int *column, int curRow, int *output)
{
int i;
if (curRow > rowCount - 1) {
static int resultCount = 0;
resultCount++;
printf("r\r\nesult %d: ", resultCount);
for (i = 0; i < rowCount; i++) {
printf("%d ", output[i]);
}
return;
}
for (i = 0; i < column[curRow]; i++) {
output[curRow] = a[curRow][i];
select(a, rowCount, column, curRow+1, output);
}
}
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei
github博客: fishmwei.github.io/