基础知识 | 每日一练(168)

基础知识练习

士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭

读者:怎样调用一个由 char * 指针指向函数名的函数?

小林:最直接的方法就是维护一个名字和函数指针的列表:

int one_func(), two_func();

int red_func(), blue_func();

struct { char *name; int (*funcptr)(); } symtab[] = {

“one_func”, one_func,

“two_func”, two_func,

“red_func”, red_func,

“blue_func”,blue_func,

};

然后搜索函数名, 就可以调用关联的函数指针。

读者:怎样实现比特数组或集合?

小林:使用 int 或 char 数组, 再加上访问所需比特的几个宏。这里有一些简单的宏定义, 用于 char 数组:

#include <limits.h> /* for CHAR_BIT */

#define BITMASK(b) (1 << ((b) % CHAR_BIT))

#define BITSLOT(b) ((b) / CHAR_BIT)

#define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b))

#define BITTEST(a, b) ((a)[BITSLOT(b)] & BITMASK(b))

如果你没有 <limits.h>, 可以定义 CHAR BIT 为 8。

读者:怎样掉换字节?

小林:Unix 有一个 swap() 的函数, 但似乎被遗忘了。使用明示的字节调换代码有个问题, 你必须决定是否要调用。更好的方法是使用函数 (例如 BSD 系统中网络函数 ntohs() 等), 函数会进行已知字符顺序和机器顺序 (未知) 之间的转换, 对于已经和机器匹配的字符顺序, 函数不作任何转换

正文完