基础知识练习
士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭
读者:怎样调用一个由 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() 等), 函数会进行已知字符顺序和机器顺序 (未知) 之间的转换, 对于已经和机器匹配的字符顺序, 函数不作任何转换