当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 程序跑飞了,求分析
帖子发表于 : 2010-11-09 21:38 
头像

注册: 2008-07-21 9:44
帖子: 2371
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
程序代码(片段):
[c]
typedef void (* api_msg_decode)(struct api_msg_msg *msg); /* api_msg_decode定义为指向函数的指针类型 */
static api_msg_decode decode[API_MSG_MAX] = { /* decode为api_msg_decode类型数组,其成员为相应的函数指针 */
do_newconn,
do_delconn,
do_bind,
do_connect,
do_disconnect,
do_listen,
do_accept,
do_send,
do_recv,
do_write,
do_close,
};


static void
do_consol_print(struct api_msg_msg *msg)
{
int i = 0;
CONSOL_Printf("msg = %x\n",msg);
for (; i < API_MSG_MAX; i++)
{
CONSOL_Printf("decode[%d] = %x\n", i, decode[i]);
}
CONSOL_Printf("do_newconn = %x\n"
"do_delconn = %x\n"
"do_bind = %x\n"
"do_connect = %x\n"
"do_disconnect = %x\n"
"do_listen = %x\n"
"do_accept = %x\n"
"do_send = %x\n"
"do_recv = %x\n"
"do_write = %x\n"
"do_close = %x\n",
do_newconn, do_delconn, do_bind, do_connect, do_disconnect,
do_listen, do_accept, do_send, do_recv, do_write, do_close);
CONSOL_Printf("do_consol_print = %x\n", do_consol_print);
}

[/c]

程序执行结果:

[c]
msg = 30008cb0

decode[0] = 200c1a

decode[1] = 300c1a

decode[2] = 400c1a

decode[3] = 500c1a

decode[4] = 600c1a

decode[5] = 700c1a

decode[6] = 800c1a

decode[7] = 900c1a

decode[8] = a00c1a

decode[9] = b00c1a

decode[10] = c00c1a

do_newconn = d3c0

do_delconn = d548

do_bind = d694

do_connect = d808

do_disconnect = d9c0

do_listen = da0c

do_accept = dab4

do_send = dacc

do_recv = db24

do_write = db64

do_close = dc40

do_consol_print = dc98
[/c]

程序在ADS1.2中编译生成,在32位ARM平台上运行。
问题是:为什么decode[0]的值不等于do_newconn函数指针?
即不能通过decode[0](msg);来实现do_newconn(msg);函数调用。其中msg是struct api_msg_msg *类型,do_newconn的函数原型是[c]static void do_newconn(struct api_msg_msg *msg);[/c]其后的do_*函数类推。这些函数及数据结构在同一个文件中定义。


_________________

My blog


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 程序跑飞了,求分析
帖子发表于 : 2010-11-11 8:52 
头像

注册: 2008-07-21 9:44
帖子: 2371
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
自己顶一下 :em11


_________________

My blog


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译