void**

higoalhwl 2008-04-14 01:25:51
假设有一个封装过的,用于获取消息队列中消息的函数声明为
get_msg_que(void **msg);

消息队列中可能存放两种结构的消息如:
typedef struct{
int msg_id; //msg_id =1
struct_msg msg_strA;
}que_msgA;

typedef struct{
int msg_id; //msg_id =2
int num;
struct_msg msg_strB;
}que_msgB;

main函数通过调用get_msg_que获取消息内容。
但由于get_msg_que可能会返回两种不同的消息结构,就要通过msg_id来进行判断。

问题:对void**不是很熟,main()如何调用get_msg_que,如何获取msg_id,希望大家帮忙。
...全文
822 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
rushman 2008-04-15
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 Chen8013 的回复:]
回楼主27楼:

你的代码肯定是有“问题”的!

你调用get_msg_que()时,buf所指向的位置没有赋值/分配空间。

难道在get_msg_que()内部给它分配数据空间吗?

如果是这样,那它占用的空间如何释放?
如果不是,你调用get_msg_que(),很有可能程序会有非法操作,你的程序崩掉了!
[/Quote]
乱紧张的

汗一个 -_-!
舉杯邀明月 2008-04-15
  • 打赏
  • 举报
回复
回楼主27楼:

  你的代码肯定是有“问题”的!

  你调用get_msg_que()时,buf所指向的位置没有赋值/分配空间。

  难道在get_msg_que()内部给它分配数据空间吗?

  如果是这样,那它占用的空间如何释放?
  如果不是,你调用get_msg_que(),很有可能程序会有非法操作,你的程序崩掉了!

rushman 2008-04-15
  • 打赏
  • 举报
回复

main()
{
char *buf;
que_msgA *msgA;
que_msgB *msgB;

buf = NULL;
msgA = NULL;
msgB = NULL;

get_msg_que((void**) &buf);

/*
* 这里判断的是第一个字节,而不是第一 int
*/
// if(*buf == 1){
/*
* 改成这样
*/
if(*((int*)buf) == 1){
msgA = (que_msgA *)buf;
....
}
// else if(*buf == 2){
else if(*((int*)buf) == 2){
msgB = (que_msgB *)buf;
....
}
}
higoalhwl 2008-04-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 higoalhwl 的帖子:]
假设有一个封装过的,用于获取消息队列中消息的函数声明为
get_msg_que(void **msg);

消息队列中可能存放两种结构的消息如:
typedef struct{
int msg_id; //msg_id =1
struct_msg msg_strA;
}que_msgA;

typedef struct{
int msg_id; //msg_id =2
int num;
struct_msg msg_strB;
}que_msgB;

main函数通过调用get_msg_que获取消息内容。
但由于get_msg_que可能会返回两…
[/Quote]


结贴了,最后采用的是这样的方法:
main()
{
char *buf;
que_msgA *msgA;
que_msgB *msgB;

buf = NULL;
msgA = NULL;
msgB = NULL;

get_msg_que((void**) &buf);

if(*buf == 1){
msgA = (que_msgA *)buf;
....
}
else if(*buf == 2){
msgB = (que_msgB *)buf;
....
}
}

应该没问题吧。


xiaofeiying 2008-04-14
  • 打赏
  • 举报
回复
我还不会

舉杯邀明月 2008-04-14
  • 打赏
  • 举报
回复
这跟Void**没关系吧?

用15楼的方法获取msg_id应该是可行的。

==================================================
至于调用时,可能应该是传入一个指针的地址 &puMSG

puMSG应该是指向一个“联合”类型的变量: puMSG = &uMSG

uMSG的定义应该如下:
typedef _U_MSG {
union {
que_msgA stcMsgA;
que_msgB stcMsgB;
} uMsg;
} UMSG;

UMSG uMSG;

这样:
puMSG->uMsg.stcMsgA.uMsg.msg_id == puMSG->uMsg.stcMsgB.uMsg.msg_id

=====================================================

若是说得不对,请大家多多指教!
higoalhwl 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ForestDB 的回复:]
C/C++ code
que_msgA * p_que_msgA = NULL;
que_msgB * p_que_msgB = NULL;
MSG * pMSG = (MSG*)malloc(sizeof(MSG)); // guess
get_msg_que((void**)(&pMSG));
if(((que_msgA*)pMSG)->msg_id == 2)
p_que_msgB = (que_msgB*)pMSG;
if(((que_msgB*)pMSG)->msg_id == 1)
p_que_msgA = (que_msgB*)pMSG;
[/Quote]

MSG结构是什么??调函数的时候可以用字符数组的方式传吗?我想用那种方法,但不知道具体怎么做。
你这个最后一行应该是p_que_msgA = (que_msgA*)pMSG吧。
p0303230 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 clhposs 的回复:]
在参数传递过程中等价于 *x[]
[/Quote]
不等价吧

[]要指定大小
higoalhwl 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mscf 的回复:]
这种方式比较粗暴啊,不过应该能行,就是用字符数组来读取消息嘛
[/Quote]

我就是不清楚这个字符数组要怎么定义,怎么传给形参。最后怎么取type。知道的话写一下让我学习吧。
ForestDB 2008-04-14
  • 打赏
  • 举报
回复

que_msgA * p_que_msgA = NULL;
que_msgB * p_que_msgB = NULL;
MSG * pMSG = (MSG*)malloc(sizeof(MSG)); // guess
get_msg_que((void**)(&pMSG));
if(((que_msgA*)pMSG)->msg_id == 2)
p_que_msgB = (que_msgB*)pMSG;
if(((que_msgB*)pMSG)->msg_id == 1)
p_que_msgA = (que_msgB*)pMSG;
rushman 2008-04-14
  • 打赏
  • 举报
回复
如果返回一个消息地址,可以这样处理。
void main(void){
//未必使用union,只是这样描述更清楚一些
union {
void * msg_ptr;
int * msg_type;
que_msgA * msg_atype;
que_msgB * msg_btype;
}msgptr;
//....
get_msg_que(&msgptr.msg_ptr);
if(*msgptr.msg_type == 1){
//que_msgA
//......
}else if(*msg.msg_type = 2){
//que_msgB
//......
}
//.....
}

薛定谔之死猫 2008-04-14
  • 打赏
  • 举报
回复
这种方式比较粗暴啊,不过应该能行,就是用字符数组来读取消息嘛
higoalhwl 2008-04-14
  • 打赏
  • 举报
回复
我们leader说,这两个消息在内存中是连续存放的,所以可一传一个char型的buf进去,buf的开始位置就是消息的id,判断好消息id后再找到相应结构进行强转。可是我不知道怎么传char型的buf进去。基于这种方式,帮忙写一下调用get_msg_que(void **msg)的代码。
薛定谔之死猫 2008-04-14
  • 打赏
  • 举报
回复
结构体在内存如何对其,这个依赖于处理器构架,谁都说不清
babyvox1999 2008-04-14
  • 打赏
  • 举报
回复
随便强制转换成哪个结构体访问msg_id都是没有问题的。
不过感觉这个设计不好
声声醉 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 higoalhwl 的帖子:]
假设有一个封装过的,用于获取消息队列中消息的函数声明为
get_msg_que(void **msg);

消息队列中可能存放两种结构的消息如:
typedef struct{
int msg_id; //msg_id =1
struct_msg msg_strA;
}que_msgA;

typedef struct{
int msg_id; //msg_id =2
int num;
struct_msg msg_strB;
}que_msgB;

main函数通过调用get_msg_que获取消息内容。
但由于get_msg_que可能会返回两…
[/Quote]

可以这样子吗?
(que_msgA *)msg->msg_id 来判断ID,强制类型转换后,并不影响msg_id的值。如果两个结构体msg_id不是都放在首位,就不能这么操作了
higoalhwl 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mscf 的回复:]
typedef struct{
int msg_id; //msg_id =1
struct_msg msg_strA;
}que_msgA;

typedef struct{
int msg_id; //msg_id =2
int num;
struct_msg msg_strB;
}que_msgB;

//在一般情况下,使用que_msgA的指针去访问que_msgA或者que_msgB的msg_id是可行的,将返回的指针强制类型转换为que_msgA *,如果发现msg_id为2,再将该指针转换成que_msgB *就能访问num和msg_strB了
[/Quote]

似乎可行,但是你说的一般情况下是什么意思呀?还有特殊情况?那可就是BUG了。一定要100%可行的代码才行呀。
higoalhwl 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Leejun527 的回复:]
可以这样试下:

C/C++ code
if((que_msgA*)msg->msg_id==1){是第一种消息}
else
是第二种消息;



不知道行不,呵呵。
[/Quote]
那main()怎么去调用那个函数?实参的形式传什么?
薛定谔之死猫 2008-04-14
  • 打赏
  • 举报
回复
typedef struct{
int msg_id; //msg_id =1
struct_msg msg_strA;
}que_msgA;

typedef struct{
int msg_id; //msg_id =2
int num;
struct_msg msg_strB;
}que_msgB;

//在一般情况下,使用que_msgA的指针去访问que_msgA或者que_msgB的msg_id是可行的,将返回的指针强制类型转换为que_msgA *,如果发现msg_id为2,再将该指针转换成que_msgB *就能访问num和msg_strB了
higoalhwl 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mscf 的回复:]
将两种结构体定义到union类型的数据中,通过设置union外的标记确定消息类型

如果你用void *返回,还得进行强制类型转换,发现消息类型后,还得再次进行强制类型转换,并且随着目标机器的不同,结构对其的规则不一样,你用一种结构去访问消息id,未必能得到实际的另一种结构的消息id
[/Quote]
两种消息结构是需求给定的,不能合并成union。
加载更多回复(10)

69,369

社区成员

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

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