结构体里包含一个联合体,问一下,怎么给这个结构体付初值呢?不知道怎么弄...

zklovehh 2010-01-29 03:39:01
简单定义几个结构体:
typedef struct tagRCV_REPORT_STRUCTExV1
{
float m_fLastClose; float m_fOpen; float m_fHigh;
} RCV_REPORT_STRUCTExV1;
//////////////////////////////////////////////////////////////////////////////////
typedef struct tagRCV_REPORT_STRUCTExV2
{
float m_fLastClose;
float m_fOpen;
float m_fHigh;
float m_fLow;
} RCV_REPORT_STRUCTExV2;
////////////////////////////////////////////////////////////////////////
typedef struct tagRCV_REPORT_STRUCTExV3
{
float m_fLastClose;
float m_fOpen;
float m_fHigh;
float m_fLow;
float m_fNewPrice;
} RCV_REPORT_STRUCTExV3;
/////定义最后一个结构体,但这个结构体包含一个有以上三种结构体组成的联合体,这个联合体包含两个int数据和三个结构体指针。
typedef struct tagRCV_DATA
{
int m_wDataType;
int m_nPacketNum;
union
{
RCV_REPORT_STRUCTExV1 * m_pReportV1;
RCV_REPORT_STRUCTExV2 * m_pReportV2;
RCV_REPORT_STRUCTExV3* m_pReportV3;
};
} RCV_DATA;
我想给最后这个结构体初始化;请问怎么初始化啊..............请高手指点.....我是这样初始化的
RCV_DATA *data=new RCV_DATA;
data->m_wDataType=1;
data->m_nPacketNum=1;
data->m_pReportV1->m_fHigh=1;
data->m_pReportV1->m_fLastClose=2;
data->m_pReportV1->m_fOpen=3;
这样话,编译没错,但是运行报错,不知道是哪错了,请给一个正确的答案,谢谢
...全文
1038 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zklovehh 2010-02-01
  • 打赏
  • 举报
回复
好了,结贴发分
zklovehh 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 syzcools 的回复:]
引用 9 楼 hufen2740 的回复:
RCV_DATA *data=new RCV_DATA;
data->m_wDataType=1;
data->m_nPacketNum=1;
data->m_pReportV1 = newRCV_REPORT_STRUCTExV3;
data->m_pReportV1->m_fHigh=1;
这样才行。


这种方法的确不错,要说点,做过大型项目的人估计都不用.这个结构体还是小的.如果很大,估计一个结构体你能浪费n多资源.就如:要放一个橘子,本来可以用一个盘子,但是你却用了一个柜子装了一个橘子.呵呵,有事,先闪了.还有 data->m_pReportV1 = newRCV_REPORT_STRUCTExV3;这个,虽然不错,但是慎用.改成data->m_pReportV3 = newRCV_REPORT_STRUCTExV3;.
当然,如果这样使用,也就丧失了,使用联合体的好处.那直接可以使用..V3结构体,也不用V1,V2,V3联合体了.
[/Quote]
看来你绝对是高手....
精锐掷矛手 2010-01-29
  • 打赏
  • 举报
回复
学习
一开始的回忆 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hufen2740 的回复:]
RCV_DATA *data=new RCV_DATA;
data->m_wDataType=1;
data->m_nPacketNum=1;
data->m_pReportV1 = newRCV_REPORT_STRUCTExV3;
data->m_pReportV1->m_fHigh=1;
这样才行。
[/Quote]

这种方法的确不错,要说点,做过大型项目的人估计都不用.这个结构体还是小的.如果很大,估计一个结构体你能浪费n多资源.就如:要放一个橘子,本来可以用一个盘子,但是你却用了一个柜子装了一个橘子.呵呵,有事,先闪了.还有 data->m_pReportV1 = newRCV_REPORT_STRUCTExV3;这个,虽然不错,但是慎用.改成data->m_pReportV3 = newRCV_REPORT_STRUCTExV3;.
当然,如果这样使用,也就丧失了,使用联合体的好处.那直接可以使用..V3结构体,也不用V1,V2,V3联合体了.
酒红色的泪 2010-01-29
  • 打赏
  • 举报
回复
七楼的方法一劳永逸,写一个构造函数、析构函数,还能防止忘记释放内存
zklovehh 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 syzcools 的回复:]
::GlobalAlloc(GPTR,...)这样申请吧,我只知道结构体,这样申请.类才如你那样申请
[/Quote]

结构体也可以用new来分配的,
zklovehh 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 syzcools 的回复:]
RCV_DATA *data=new RCV_DATA;
data->m_wDataType=1;
data->m_nPacketNum=1;
RCV_REPORT_STRUCTExV1 v1=::Global(GPTR,sizeof(RCV_REPORT_STRUCTExV1));
data->m_pReportV1=v1;
v1.m_fHigh=1; //或者data->m_pReportV1.m_fHigh=1;

如果用v3的东西,就要申请v3
如:RCV_REPORT_STRUCTExV3 v3=::Global(GPTR,sizeof(RCV_REPORT_STRUCTExV3));
data->m_pReportV3=v3;
...
[/Quote]
有点看不明白,不过好像有比这个简单的方法,还是要谢谢你
zklovehh 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hufen2740 的回复:]
RCV_DATA *data=new RCV_DATA;
data->m_wDataType=1;
data->m_nPacketNum=1;
data->m_pReportV1 = newRCV_REPORT_STRUCTExV3;
data->m_pReportV1->m_fHigh=1;
这样才行。
[/Quote]
啥也别说了,这才是正确的,正是我想要的答案
一开始的回忆 2010-01-29
  • 打赏
  • 举报
回复
RCV_DATA *data=new RCV_DATA;
data->m_wDataType=1;
data->m_nPacketNum=1;
RCV_REPORT_STRUCTExV1 v1=::Global(GPTR,sizeof(RCV_REPORT_STRUCTExV1));
data->m_pReportV1=v1;
v1.m_fHigh=1; //或者data->m_pReportV1.m_fHigh=1;

如果用v3的东西,就要申请v3
如:RCV_REPORT_STRUCTExV3 v3=::Global(GPTR,sizeof(RCV_REPORT_STRUCTExV3));
data->m_pReportV3=v3;
...
hufen2740 2010-01-29
  • 打赏
  • 举报
回复
RCV_DATA *data=new RCV_DATA;
data->m_wDataType=1;
data->m_nPacketNum=1;
data->m_pReportV1 = new RCV_REPORT_STRUCTExV3;
data->m_pReportV1->m_fHigh=1;
这样才行。
jx1j1x 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 syzcools 的回复:]
::GlobalAlloc(GPTR,...)这样申请吧,我只知道结构体,这样申请.类才如你那样申请
[/Quote]
呵呵一样的,结构体一样能new的,你那个是c申请内存方法而已。new的是c++,呵呵
量子 2010-01-29
  • 打赏
  • 举报
回复
定义析构函数,解构函数吧
C++中struct和Class没有太大区别
一开始的回忆 2010-01-29
  • 打赏
  • 举报
回复
::GlobalAlloc(GPTR,...)这样申请吧,我只知道结构体,这样申请.类才如你那样申请
jx1j1x 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zklovehh 的回复:]
引用 1 楼 jx1j1x 的回复:
RCV_REPORT_STRUCTExV1  * m_pReportV1;
RCV_REPORT_STRUCTExV2 * m_pReportV2;
RCV_REPORT_STRUCTExV3* m_pReportV3;
这是结构体指针,你都没有给他们申请内存
data->m_pReportV1->m_fHigh=1;
data->m_pReportV1->m_fLastClose=2;
data->m_pReportV1->m_fOpen=3;

怎么可以初始化赋值呢。

怎么给他们分配空间啊?
我这样给分配的RCV_REPORT_STRUCTExV1  * m_pReportV1=new RCV_REPORT_STRUCTExV1 ; 但也不行啊,还是编译时不报错,运行时报错,到底该怎么用啊
[/Quote]
其他几个都要这样申请内存。
你贴出所有代码看看
一开始的回忆 2010-01-29
  • 打赏
  • 举报
回复
恩,支持楼上.擦,赶紧给个回复.那个帖子给你回复过了.
zklovehh 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jx1j1x 的回复:]
RCV_REPORT_STRUCTExV1  * m_pReportV1;
RCV_REPORT_STRUCTExV2 * m_pReportV2;
RCV_REPORT_STRUCTExV3* m_pReportV3;
这是结构体指针,你都没有给他们申请内存
data->m_pReportV1->m_fHigh=1;
data->m_pReportV1->m_fLastClose=2;
data->m_pReportV1->m_fOpen=3;

怎么可以初始化赋值呢。
[/Quote]
怎么给他们分配空间啊?
我这样给分配的RCV_REPORT_STRUCTExV1 * m_pReportV1=new RCV_REPORT_STRUCTExV1 ; 但也不行啊,还是编译时不报错,运行时报错,到底该怎么用啊
jx1j1x 2010-01-29
  • 打赏
  • 举报
回复
RCV_DATA *data=new RCV_DATA;
data->m_wDataType=1;
data->m_nPacketNum=1;
data->m_pReportV1 = new RCV_REPORT_STRUCTExV1;
data->m_pReportV1->m_fHigh=1;
这样才行。
jx1j1x 2010-01-29
  • 打赏
  • 举报
回复
RCV_REPORT_STRUCTExV1 * m_pReportV1;
RCV_REPORT_STRUCTExV2 * m_pReportV2;
RCV_REPORT_STRUCTExV3* m_pReportV3;
这是结构体指针,你都没有给他们申请内存
data->m_pReportV1->m_fHigh=1;
data->m_pReportV1->m_fLastClose=2;
data->m_pReportV1->m_fOpen=3;

怎么可以初始化赋值呢。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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