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的文档更好。
...全文
37 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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列的二维数组嘛。有什么问题吗?

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧