递归火山软件开发平台

标题: [结构体]火山PC传递(嵌套)结构体的方案二 [打印本页]

作者: 609177738    时间: 2021-10-3 15:18
标题: [结构体]火山PC传递(嵌套)结构体的方案二
继上一篇 【结构体】解决火山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 对象名   在大环境下 如果有交集 要注意能否区分开来的问题  


最后附上案例



作者: tmf19901124    时间: 2021-10-5 17:36
不要在纠结结构体了,老老实实的嵌入使用吧!
作者: 伟业    时间: 2021-10-5 20:45
学习.....
作者: 高山!&流水    时间: 2021-10-5 20:48
感觉跟不上大神节奏
作者: qaz2428119    时间: 2021-10-7 21:00
结构类限制还是太多,没法把结构指针赋给结构体类实例,就是最大的不足
作者: 子涵    时间: 2021-10-8 16:01
火山结构体太麻烦了,结构体里嵌套结构体数组怎么实现?
作者: itismine    时间: 2021-10-9 19:29
怎么获取结构体尺寸?
作者: 609177738    时间: 2021-10-9 20:22
itismine 发表于 2021-10-9 19:29
怎么获取结构体尺寸?

c++的sizeof
作者: itismine    时间: 2021-10-9 21:35
609177738 发表于 2021-10-9 20:22
c++的sizeof

@ return (INT)sizeof(this->s);
作者: ntesi    时间: 2021-10-10 22:01
学习学习
作者: 67564226    时间: 2021-10-10 22:40
这大神的东西,都看不懂了。
作者: 181912068    时间: 2023-8-29 17:06
调用api参数为类时怎么办阿

<火山程序 类型 = "通常" 版本 = 1 />

方法 CopyMemory_SYSTEM_PROCESSES <公开 静态 返回值注释 = "VOID" @禁止流程检查 = 真 @视窗.输入 = "kernel32.dll"
        @输出名 = "RtlMoveMemory">
参数 Destination <类型 = SYSTEM_PROCESSES 注释 = "VOID UNALIGNED *Destination,指向移动目的地址的指针。" "">
参数 Source <类型 = 整数 注释 = "const VOID UNALIGNED *Source,指向要复制的内存地址的指针。">
参数 Length <类型 = 整数 注释 = "SIZE_T Length 指定要复制的字节数。">
{
    // 方法使用"@视窗.输入"属性时,所有参数的数据类型必须为基本数据类型或字节集类或设置了"@视窗.结构类"属性的类数据类型.






欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4