609177738 发表于 2021-10-3 15:18:03

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

继上一篇 【结构体】解决火山PC传递(嵌套)结构体的优化方案 被官方所嫌弃抽空看了下官方的 @视窗.结构类0 的问题
发现问题所在实际上官方的结构体是可以实现的 不过不知道为什么 写了一半就没了....也许另有高招 ???
实际就差一行代码就可以实现了   至于官方改进我也没抱什么希望 民间流传着一句话你尽管提,改了算我输
当然要真改起来并不是那么简单,这我就不关心了,我只教用户现阶段怎么使用
static/image/hrline/1.gif


下面开始分析   手写一个 RECT   一个 SIZE   一个自定义嵌套类

类名 基础类 公开 属性名 属性值备注
RECT类    √ @视窗.结构类 0


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


类名 基础类 公开 属性名 属性值备注
SIZE类    √ @视窗.结构类 0

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

类名 基础类 公开 属性名 属性值备注
结构体嵌套类    √ @视窗.结构类 0

成员变量名 类型 公开 静态参考初始值属性名属性值备注
i 整数√
rc RECT类√
si SIZE类√

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

// Generated by Volcano Development Platform - http://www.voldp.com
#ifndef __VCLS_RG_HSH_JG_RG_RECTL_H__
#define __VCLS_RG_HSH_JG_RG_RECTL_H__
namespace rg_hsh_jg
{
class rg_RECTl : public CVolObject
{
DECLARE_VOL_CLASS (rg_hsh_jg, rg_RECTl)
public:
rg_RECTl ();
virtual void LoadFromStream (CVolBaseInputStream& stream) override;
virtual void SaveIntoStream (CVolBaseOutputStream& stream) override;
public:
INT rg_n2;
INT rg_n3;
INT rg_n4;
INT rg_n5;
public:
<font color="red"><strong> struct S
{
INT rg_n2;
INT rg_n3;
INT rg_n4;
INT rg_n5;
};</strong></font>
<font color="magenta"><strong> S* GetStruct (S* pInf);</strong></font>
void SetStruct (const S* pInf);
};
}
#endif //__VCLS_RG_HSH_JG_RG_RECTL_H__在对应的cpp例 查看到了 GetStruct 函数

rg_RECTl::S* rg_RECTl::GetStruct (rg_RECTl::S* pInf)
{
pInf->rg_n2 = rg_n2;
pInf->rg_n3 = rg_n3;
pInf->rg_n4 = rg_n4;
pInf->rg_n5 = rg_n5;
return pInf;
}这个函数 实现了 从火山的类 成员 给结构体赋值
但是!!! 问题在于 这个类里面并没有这个结构体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>::   表明是基类的函数

static/image/hrline/1.gif
测试用c++函数
struct mystruct {
int i;
RECT rc;
SIZE si;
};
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   

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

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


最后附上案例


tmf19901124 发表于 2021-10-5 17:36:40

不要在纠结结构体了,老老实实的嵌入使用吧!

伟业 发表于 2021-10-5 20:45:20

学习.....

高山!&流水 发表于 2021-10-5 20:48:59

感觉跟不上大神节奏

qaz2428119 发表于 2021-10-7 21:00:59

结构类限制还是太多,没法把结构指针赋给结构体类实例,就是最大的不足

子涵 发表于 2021-10-8 16:01:19

火山结构体太麻烦了,结构体里嵌套结构体数组怎么实现?

itismine 发表于 2021-10-9 19:29:37

怎么获取结构体尺寸?

609177738 发表于 2021-10-9 20:22:10

itismine 发表于 2021-10-9 19:29
怎么获取结构体尺寸?

c++的sizeof

itismine 发表于 2021-10-9 21:35:22

609177738 发表于 2021-10-9 20:22
c++的sizeof

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

ntesi 发表于 2021-10-10 22:01:59

:)学习学习
页: [1] 2
查看完整版本: [结构体]火山PC传递(嵌套)结构体的方案二