递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 12593|回复: 11
打印 上一主题 下一主题

[视窗] [结构体]火山PC传递(嵌套)结构体的方案二

[复制链接]

26

主题

204

帖子

3193

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
3193
跳转到指定楼层
楼主
发表于 2021-10-3 15:18:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
继上一篇 【结构体】解决火山PC传递(嵌套)结构体的优化方案 被官方所嫌弃  抽空看了下官方 @视窗.结构类  0 的问题
发现问题所在  实际上官方的结构体是可以实现的 不过不知道为什么 写了一半就没了....也许另有高招 ???
实际就差一行代码就可以实现了   至于官方改进我也没抱什么希望 民间流传着一句话  你尽管提,改了算我输
当然要真改起来并不是那么简单,这我就不关心了,我只教用户现阶段怎么使用



下面开始分析     手写一个 RECT   一个 SIZE   一个自定义嵌套类
类名 基础类 公开 属性名 属性值备注
RECT类    √ @视窗.结构类 0

成员变量名 类型 公开 静态参考初始值属性名属性值备注
left 整数  √
top 整数  √
right 整数  √
bottom 整数  √
--------------------------------------------------------------------------

类名 基础类 公开 属性名 属性值备注
SIZE类    √ @视窗.结构类 0
成员变量名 类型 公开 静态参考初始值属性名属性值备注
x 整数  √
y 整数  √
---------------------------------------------------------------------------
类名 基础类 公开 属性名 属性值备注
结构体嵌套类    √ @视窗.结构类 0
成员变量名 类型 公开 静态参考初始值属性名属性值备注
i 整数  √
rc RECT类  √
si SIZE类  √


随便写个程序  写个 结构体嵌套类 的对象  赋值 调试下(无加密狗)   在我这里输出的对应文件名如下
结构体嵌套类  对应 vcls_rg_jgtktl.h
RECT类          对应 vcls_rg_RECTl.h
SIZE类           对应 vcls_rg_SIZEl.h
-------------------
我们以 RECT类 为例  文件内容如下

  1. // Generated by Volcano Development Platform - http://www.voldp.com
  2. #ifndef __VCLS_RG_HSH_JG_RG_RECTL_H__
  3. #define __VCLS_RG_HSH_JG_RG_RECTL_H__
  4. namespace rg_hsh_jg
  5. {
  6. class rg_RECTl : public CVolObject
  7. {
  8. DECLARE_VOL_CLASS (rg_hsh_jg, rg_RECTl)
  9. public:
  10. rg_RECTl ();
  11. virtual void LoadFromStream (CVolBaseInputStream& stream) override;
  12. virtual void SaveIntoStream (CVolBaseOutputStream& stream) override;
  13. public:
  14. INT rg_n2;
  15. INT rg_n3;
  16. INT rg_n4;
  17. INT rg_n5;
  18. public:
  19. <font color="red"><strong> struct S
  20. {
  21. INT rg_n2;
  22. INT rg_n3;
  23. INT rg_n4;
  24. INT rg_n5;
  25. };</strong></font>
  26. <font color="magenta"><strong> S* GetStruct (S* pInf);</strong></font>
  27. void SetStruct (const S* pInf);
  28. };
  29. }
  30. #endif //__VCLS_RG_HSH_JG_RG_RECTL_H__
复制代码
在对应的cpp例 查看到了 GetStruct 函数

  1. rg_RECTl::S* rg_RECTl::GetStruct (rg_RECTl::S* pInf)
  2. {
  3. pInf->rg_n2 = rg_n2;
  4. pInf->rg_n3 = rg_n3;
  5. pInf->rg_n4 = rg_n4;
  6. pInf->rg_n5 = rg_n5;
  7. return pInf;
  8. }
复制代码
这个函数 实现了 从火山的类 成员 给结构体赋值  
但是!!! 问题在于 这个类里面并没有这个结构体S的对象 !!!
并且 结构体S 是自动在类里面生成的 结构体声明, 用户想自己通过 类嵌入行代码 添加结构体S对象  实测是行不通的
因为 用户添加的嵌入代码永远是在 结构体S声明的上面 是识别不了的  
---------------------------------------
那么官方的结构体类没有提供这个S的对象 怎么办呢  我采用的方法是 写个普通类来继承结构体类
以上面的自定义结构体为例   即 你要使用的最终结构体(不论是基础的 还是嵌套的)
类名 基础类 公开 属性名 属性值备注
结构体实现类 结构体嵌套类   √
@begin
<include>
public:
@sn<base_class>::S s;     ////// 这里也可以省略@sn<base_class>::   写这个是告诉你这个基类的嵌套的结构体S   
</include>

@end
方法名 公开 类别静态属性名属性值备注
取结构体指针   √ 通常 @禁止流程检查
返回值类型变整数 返回值备注
@ return (INT_P)@sn<base_class>::GetStruct(&(this->s));  ////这里也可以省略@sn<base_class>::   表明是基类的函数


测试用  c++函数
  1. struct mystruct {
  2. int i;
  3. RECT rc;
  4. SIZE si;
  5. };
  6. static void test_mystruct(mystruct cs);
复制代码
火山调用c++测试函数
方法名公开 类别 静态 属性名属性值 备注
测试RECT_火山结构类   √    √
返回值类型 返回值备注
参数名类型 属性名属性值
rect变整数
@ test_mystruct(*(mystruct*)@<rect>);
-----------------------------------------------------------------------------------------------------------

用的时候就可以 直接声明一个  结构体实现类 的对象    以局部变量为例
局部变量名类型 静态 参考 初始值 属性名 属性值 备注
结构实现 结构体实现类

结构实现.i = 573
结构实现.rc.left = 321

结构实现.rc.top = 654
结构实现.rc.right = 789
结构实现.rc.bottom = 963
结构实现.si.x = 10
结构实现.si.y = 21
测试RECT_火山结构类 (结构实现.取结构体指针 ())
---------------------------------
c++函数输出mystruct结构内容:  , 573, 321, 654, 789, 963, 10, 21   


里面还有一个  void SetStruct (const S* pInf);   具体的按你们自己的需求自己写方法吧


个人感觉这个方法也同样简单些  你们认为呢    小白也可以使用  那几行嵌入行直接复制粘贴就行了  
不管怎样一定要注意 S 的使用  就目前我观察结果 所有的结构体在对应类中的 结构体声明都是S  
直接复制粘贴 也要注意嵌入的 S 对象名   在大环境下 如果有交集 要注意能否区分开来的问题  


最后附上案例


官方嵌套结构体方案.png (19.34 KB, 下载次数: 69)

官方嵌套结构体方案.png

struct方案二.rar

16.35 KB, 下载次数: 75

回复

使用道具 举报

7

主题

247

帖子

2025

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
2025
沙发
发表于 2021-10-5 17:36:40 | 只看该作者
不要在纠结结构体了,老老实实的嵌入使用吧!
回复

使用道具 举报

17

主题

792

帖子

2746

积分

金牌会员

Rank: 6Rank: 6

积分
2746
板凳
发表于 2021-10-5 20:45:20 | 只看该作者
学习.....
回复

使用道具 举报

11

主题

196

帖子

1850

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1850
地板
发表于 2021-10-5 20:48:59 | 只看该作者
感觉跟不上大神节奏
回复

使用道具 举报

25

主题

497

帖子

1808

积分

金牌会员

Rank: 6Rank: 6

积分
1808
5#
发表于 2021-10-7 21:00:59 | 只看该作者
结构类限制还是太多,没法把结构指针赋给结构体类实例,就是最大的不足
回复

使用道具 举报

0

主题

8

帖子

67

积分

注册会员

Rank: 2

积分
67
6#
发表于 2021-10-8 16:01:19 | 只看该作者
火山结构体太麻烦了,结构体里嵌套结构体数组怎么实现?
回复

使用道具 举报

69

主题

448

帖子

3121

积分

论坛元老

Rank: 8Rank: 8

积分
3121
7#
发表于 2021-10-9 19:29:37 | 只看该作者
怎么获取结构体尺寸?
回复

使用道具 举报

26

主题

204

帖子

3193

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
3193
8#
 楼主| 发表于 2021-10-9 20:22:10 | 只看该作者
itismine 发表于 2021-10-9 19:29
怎么获取结构体尺寸?

c++的sizeof
回复

使用道具 举报

69

主题

448

帖子

3121

积分

论坛元老

Rank: 8Rank: 8

积分
3121
9#
发表于 2021-10-9 21:35:22 | 只看该作者

@ return (INT)sizeof(this->s);
回复

使用道具 举报

4

主题

13

帖子

101

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
101
10#
发表于 2021-10-10 22:01:59 | 只看该作者
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-28 01:29 , Processed in 0.097932 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表