|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
RTOS相关:谁能解决这个指针问题? |
作者:treul 栏目:嵌入式系统 |
typedef struct t_msg { int a; CHAR b; } T_MSG; typedef struct _mess { SHORT c; unsigned int d; BOOL e; } NET_MSG; ER prcv_mbx(ID, T_MSG**); void func(int x) { NET_MSG *rmess; . . if(prcv_mbx((ID)mbxid, (T_MSG**)&rmess)==OK) rmess->e = TRUE; //请问高手们,收到消息后,rmess仍旧是NET_MSG*类型吗?我认为rmess指向的实际上应该已经是T_MSG类型的东东了,对吗? . . } |
2楼: | >>参与讨论 |
作者: treul 于 2005/1/11 17:37:00 发布:
help 没人能回答吗? |
3楼: | >>参与讨论 |
作者: computer00 于 2005/1/11 18:07:00 发布:
怎么会变呢?它依然是NET_MSG*类型 强制类型转化,只是临时的。 |
4楼: | >>参与讨论 |
作者: treul 于 2005/1/11 18:32:00 发布:
但是, 消息实体是T_MSG结构的啊。收到消息后,rmess的值(也就是一个地址),已经是指向这个消息实体了啊。这时候再引用NET_MSG的成员还有意义吗? |
5楼: | >>参与讨论 |
作者: highend 于 2005/1/11 19:42:00 发布:
看一看 函数的调用,参数的传递....... 这属于C语言的基本问题 |
6楼: | >>参与讨论 |
作者: computer00 于 2005/1/11 19:46:00 发布:
rmess的值,什么时候被改变了?不是一直没有变么? |
7楼: | >>参与讨论 |
作者: treul 于 2005/1/12 9:08:00 发布:
我知道,类型转化是临时的,但是: prcv_mbx((ID)mbxid, (T_MSG**)&rmess) 中把rmess的地址作为参数传递给函数,那么调用以后,rmess的地址上实际已经存放了一个指向T_MSG结构的指针了,对吧?那继续把rmess当作NET_MSG的指针来引用还有什么意义?rmess->e = ... |
8楼: | >>参与讨论 |
作者: computer00 于 2005/1/12 12:28:00 发布:
晕 你在函数prcv_mbx((ID)mbxid, (T_MSG**)&rmess) 里改变了rmess的值么? 即使你改变它的值,它的类型也是改变不了的。 rmess的类型始终是NET_MSG,不管它指向了那里。 所以必须要用rmess->e 来访问。 如果你认为rmess指向了T_MSG, 而用rmess指向T_MSG的成员,则编译通不过。 rmess的类型是改不了的。如果要改,只能在用的时候, 加强制类型转换,象prcv_mbx((ID)mbxid, (T_MSG**)&rmess)里的 那个强制类型转换。 |
9楼: | >>参与讨论 |
作者: treul 于 2005/1/12 16:12:00 发布:
computer00: 谢先! 我说了,我知道rmess的类型没有变。我是想说,在函数调用以后,虽然rmess的类型没有变(仍然是NET_MSG*),但是它实际上指向的地址处是一个T_MSG结构的数据结构。你说是吗??因为prcv_mbx函数的功能就是把一个T_MSG*型的指针(也就是消息指针)存放到T_MSG**处。我觉得这时候再用rmess引用NET_MSG的成员有点不解~ |
10楼: | >>参与讨论 |
作者: computer00 于 2005/1/12 16:42:00 发布:
你怎么不把prcv_mbx函数贴上来? 你不贴出来,我们怎么知道prcv_mbx是否改变了rmess的值? |
11楼: | >>参与讨论 |
作者: treul 于 2005/1/12 18:56:00 发布:
呵呵 谢谢了computer00! 交个朋友? 那个函数是内核了,你也知道。uITRON4的。 我大致也整明白了。Thank u! |
12楼: | >>参与讨论 |
作者: computer00 于 2005/1/12 20:11:00 发布:
客气 |
13楼: | >>参与讨论 |
作者: ruanhsh 于 2005/1/13 20:41:00 发布:
treul:你的理解是正确的 treul:你的理解是正确的,实际上,你记住一个关键点, 在prcv_mbx内部实现,一定是将一个NET_MSG*赋值给rmess的, 只是这种赋值过程它会先通过强制为T_MSG*,就像你接口的类型转换一样。 不然,rmess->e的就非预测的值了。 这种方法是为统一接口,其实做的并不是很好。 |
|
|
Copyright © 1998-2006 domainnameq.cn 浙ICP证030469号 |