• 全部
  • 问答

c语言数组的问题。

Elkel 2002-06-21 09:54:28
我阅读net-snmp源码看到以下数组声明,高手能给我指点一下吗?
#define DS_MAX_IDS 3
#define DS_MAX_SUBIDS 32 /* needs to be a multiple of 8 */

...

char ds_booleans[DS_MAX_IDS][DS_MAX_SUBIDS / 8]; /* bit vector storage. */

如果能告诉我哪能下在iso c99的文档更好。
...全文
6 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
GarlandGreene 2002-06-21
还记得吗?C语言中char和int这两种类型是可以互换的,程序中不管将which进行如何的运算,which的值还是int型的,将一个int型的数据存放到一个char型的变量中没什么问题呀。
回复
GarlandGreene 2002-06-21
#define DS_MAX_IDS 3 //常量定义,DS_MAX_IDS的值为3
#define DS_MAX_SUBIDS 32 //常量定义,DS_MAX_SUBIDS的值为32

/*编译器在编译的时候会将DS_MAX_IDS和DS_MAX_SUBIDS的值代入程序中, DS_MAX_SUBIDS/8的值也会在编译过程中计算好,所以以下语句和
char ds_booleans[3][4];并没有任何区别*/

char ds_booleans[DS_MAX_IDS][DS_MAX_SUBIDS / 8];

回复
beijingshizi 2002-06-21
二维数组,不过使用宏来代替数字而已
回复
oujinliang 2002-06-21
没有吧。数组元素还是char类型的。只不过赋的值是个经过移位后的特殊的字节了。具体含义你自己查吧。
回复
Elkel 2002-06-21
看了注释,怀疑数组能按位存储。
看看一下代码

int
ds_set_boolean(int storeid, int which, int value)
{

if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
storeid < 0 || which < 0)
return SNMPERR_GENERR;

DEBUGMSGTL(("ds_set_boolean", "Setting %d:%d = %d/%s\n", storeid,
which, value, ((value) ? "True" : "False")));

if (value > 0)
ds_booleans[storeid][which / 8] |= (1 << (which % 8));
else
ds_booleans[storeid][which / 8] &= (0xff7f >> (7 - (which % 8)));

return SNMPERR_SUCCESS;
}
回复
doer_ljy 2002-06-21
这部就是宏吗?
用define定义DS_MAX_IDS 和DS_MAX_SUBIDS
在程序中用的DS_MAX_SUBIDS 的时候就直接用32替换DS_MAX_SUBIDS
那个数组定义等价于char ds_booleans[3][32/8]
使用define的好处是,如果需要改变DS_MAX_SUBIDS 你只需要在define里改变一次,而如果不这么做,有可能会修改程序中的很多处!
比如定义一个IP相关的数组,你想用char型变量来存,那么如果是IPV4你要用4,这样在程序中你可能不只一处运用这个值,但是如果你的程序要适应IPV6那么,你又得把它们同意的改成6这样很麻烦,所以可以定义define IPbit 4
这样适应IPV6时只需要把它改成define IPbit 6就可以了

回复
ysr 2002-06-21
结果不就是
char ds_booleans[3][4]的4行3列的二维数组嘛。有什么问题吗?
回复
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-06-21 09:54
社区公告
暂无公告