递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[视窗] 【结构体】解决火山PC传递(嵌套)结构体的优化方案

[复制链接]

26

主题

204

帖子

3187

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
3187
跳转到指定楼层
楼主
发表于 2021-9-30 01:08:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 609177738 于 2021-10-5 13:50 编辑

首先向涛哥反抗一波,没有研究精神还敲什么代码!!! 具体看图片 ,不至于被删帖吧
本文方法涛哥不是很认可!!!
各位封装用户应该都知道,火山PC调用外部库时,当函数参数为结构体(struct类型)时非常麻烦
官方提供的结构体基础类啥的 ,恕我直言,花里胡哨的,瞅了一眼,没看懂,也没仔细看,也不想看了...
---------------------------------------------------------------------------
各位封装用户大多是都是采用  嵌入类成员变量 来操作的
简单点的结构体还好说 ,比如RECT 也就4个成员 写四个属性读 四个属性写 就解决了  
但是!!! 当结构体复杂时,尤其是嵌套结构体 ,难不成 每一种 组合类型的结构体 都要重新写一遍???
因此本文就是解决这个问题的!
因此本文就是解决这个问题的!
因此本文就是解决这个问题的!

-------------------------------------------
不想看过程的可以直接看代码区 或 直接下载附件
-------------------------------------------
懂C++的应该知道结构体也是一种类,特殊的类,不懂得百度  
那为什么火山的类强制转换结构体不能用呢?
问题在于 火山默认所有的类都会继承CVolObject 也就是 对象类  ,这个类里有成员变量 用于各种类和数据类型判断是否为空对象等
经过我的不懈研究,发现  @外部基础类 会使所在类不会继承 CVolObject ,但是翻译的时候还会自动在类里面添加 一行宏,
当火山的类 没有类成员时  为 DECLARE_EMPTY_VOL_CLASS  有成员则为 DECLARE_VOL_CLASS  
不去掉会报错,这个翻译的过程我办法取消,不让它生成 但是 既然是宏 就可以#undef  !!!! 意思是取消宏
通过@视窗.前缀文本  可以在class前面加 #undef   但是取消宏 还是会导致下面宏未定义 ,所以紧接着用#define 把这个宏定义为空
总结 @视窗.前缀文本 的内容如下,注意 最后的/**/ 不能省略  不然 翻译的时候不会换行
  1. #undef DECLARE_VOL_CLASS
  2. #define DECLARE_VOL_CLASS(name_space, class_name)
  3. #undef DECLARE_EMPTY_VOL_CLASS
  4. #define DECLARE_EMPTY_VOL_CLASS(name_space, class_name)
  5. /**/
复制代码

如果仅仅是这样 还会导致 本类缺少函数定义和其他正常类报错,所以还需要恢复这个宏 并补上本类的函数定义 ,在类下添加以下内容
  1. @begin
  2. <include>
  3. #undef DECLARE_VOL_CLASS
  4. #define DECLARE_VOL_CLASS(name_space, class_name)  \
  5.         DECLARE_VOL_CLASS_NOT_OVR_COMP (name_space, class_name)  \
  6.         _DECLARE_VOL_CLASS_COMPARE_OPERATOR (class_name)
  7. #undef DECLARE_EMPTY_VOL_CLASS
  8. #define DECLARE_EMPTY_VOL_CLASS(name_space, class_name)  \
  9.         DECLARE_EMPTY_VOL_CLASS_NOT_OVR_COMP (name_space, class_name)  \
  10.         _DECLARE_VOL_CLASS_COMPARE_OPERATOR (class_name)
  11. BOOL @sn<current_class>::_IsSelfEqual (const @sn<current_class>& objCompare) const;
  12. void @sn<current_class>:: _CopySelfFrom (const @sn<current_class>& objCopyFrom);
  13. public:   
  14. inline_ BOOL operator== (const @sn<current_class>& objCompare) const  { return (this == &objCompare); }
  15. inline_ BOOL operator!= (const @sn<current_class>& objCompare) const  { return (this != &objCompare); }
  16. inline_ void LoadFromStream (CVolBaseInputStream& stream){}
  17. inline_ void SaveIntoStream (CVolBaseOutputStream& stream){}
  18. </include>
  19. @end
复制代码

以RECT为例
你可以选择直接使用 @外部基础类  "RECT"  然后写4个属性读  4个属性写的函数 来给left ,top,right,bottom赋值
如果不想直接继承,关键@外部基础类 还不能空着 咋办???  写一个头文件 或者去系统文件里  写一个空类
案例给的是
  1. class emptybass { };
复制代码
那么就填写@外部基础类 "emptybass "     即可  此步骤非常重要

如此就完成了,纯粹的类,没有杂质的类,没有额外类成员的类!!!
下面你就可以实现嵌套结构类,而不用像之前那么不断从头写了
直接在火山类成员类型使用你写好的类就行  具体的可以参考案例
最后再说下 嵌入调用的传递问题
类直接强转结构体是行不通的 需要通过指针中转下
例如  火山函数  的参数  为   rect   RECT类     // RECT类是火山的类执行以上操作
c++函数为 void test_rect(RECT rc)
嵌入写法是
@ test_rect (*(RECT*)&@<rect> );
-----------------------------------------------------------------------
最后再说下可能出现的问题
伴随着版本更新,本文解决方案可能会出现新的报错!!!
我白天给涛哥发的 是今天 2021年9月30日新版本更新之前的 案例 正常使用  
然后今天下午更新了,涛哥又是晚上才接收的案例,然后就报错了 ,然后就说了如图的那句话!!!
然后我就不服气的 继续研究了  特此发文
不敢保证以后的版本 涛哥又会往里面加什么内容 ,也不敢保证能不能继续解决
但是 至少目前的版本应该能用很长时间

最后附上案例
----
更新 案例二
[结构体]火山PC传递(嵌套)结构体的方案二  




$(81QF(K[}VG$79}MZK[VVL.png (24.31 KB, 下载次数: 69)

$(81QF(K[}VG$79}MZK[VVL.png

struct.rar

48.08 KB, 下载次数: 37

(嵌套)结构体案例

回复

使用道具 举报

26

主题

204

帖子

3187

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
3187
来自 8#
 楼主| 发表于 2021-9-30 21:31:23 | 只看该作者
本帖最后由 609177738 于 2021-9-30 21:37 编辑

关于 赋值 新变量是没有问题的,正常用=号即可赋值
唯一的不常用的是 判断同类的不同对象内容是否相等  
目前采用 memcmp 对比数据 网上说 字节对齐的数据填充是随机的  测试确实有问题
所以 在类初始化 使用memset 使得字节清零  再使用memcmp 对比数据是否相同

测试没遇到什么问题了  不知道还有没有其他可能出现的问题,也没搜索到

持续化 是啥  没明白  读写赋值 比较 都有了  

至于后续的 可能加持的一些东西 也不是不可以手动添加转换 就好比说 什么序列化 之类的  
我也知道CVolObject 是火山的框架基石 但是  针对一个结构体  单独从框架基石上拿下来也没什么不可
这些功能基本上足够了, 像序列化等之类的 也可以用外置函数来转换呀
重要的是用起来简便 快速 小白也可以非常快速使用 ,直接自己添加成员变量就行了

也像你所说   不太适合官方    所以 我也是发出来 给愿意使用的人一个快速的方法  至于采不采纳在于大众啦  


最后更新下  


struct.rar

73.89 KB, 下载次数: 13

9.30更新

回复

使用道具 举报

7

主题

247

帖子

2025

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
2025
沙发
发表于 2021-9-30 14:46:41 | 只看该作者
对结构体来说无论什么骚路子都不好用,但是你这个方法让我想到了可以不用封装,直接继承使用大量的类。。。
回复

使用道具 举报

62

主题

1674

帖子

8609

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
8609
板凳
发表于 2021-9-30 14:52:54 | 只看该作者
首先很佩服你的专研精神,但是你没想过为什么类必须继承于CVolObject? 你上面弄的类对象没法比较没法持续化没法赋值,而且所有火山操作都假设类对象是基于CVolObject的,你这样弄啥时候程序崩的都不清楚.

另外,把私聊的话公开贴出来是很不礼貌的行为,建议以后不要这么做.
回复

使用道具 举报

444

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
40529
地板
发表于 2021-9-30 14:55:19 | 只看该作者
本帖最后由 创世魂 于 2021-9-30 14:58 编辑

如果真的遇到嵌套类,就需要把所有嵌套都封装成火山的类形式。  就是苦力活,习惯就好。
这样做有很多好处的,尤其是对普通用户而言,调用更加友好。。(如果是自己私用的,当我没说,自己私用的,随便怎么用都行。)
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

26

主题

204

帖子

3187

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
3187
5#
 楼主| 发表于 2021-9-30 16:12:29 | 只看该作者
本帖最后由 609177738 于 2021-9-30 17:30 编辑
飞扬工作室 发表于 2021-9-30 14:52
首先很佩服你的专研精神,但是你没想过为什么类必须继承于CVolObject? 你上面弄的类对象没法比较没法持续化 ...

这点我的错,向涛哥道歉
但是作为结构类 通常不需要去比较呀(这个比较是直接复制源码里的,刚测试不行,我重写了用,memcmp比较,正在测试,这个函数可能会出问题,不过应该总有办法解决的),仅仅是传参,而且这个测试也可以赋值新变量。。。在c++中也没见哪个项目必须要继承某个类。。。所以问题也不大
回复

使用道具 举报

26

主题

204

帖子

3187

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
3187
6#
 楼主| 发表于 2021-9-30 16:19:12 | 只看该作者
飞扬工作室 发表于 2021-9-30 14:52
首先很佩服你的专研精神,但是你没想过为什么类必须继承于CVolObject? 你上面弄的类对象没法比较没法持续化 ...

图片我这边编辑没有删除选项,帮忙删下,再次道歉
回复

使用道具 举报

62

主题

1674

帖子

8609

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
8609
7#
发表于 2021-9-30 21:16:21 | 只看该作者
609177738 发表于 2021-9-30 16:19
图片我这边编辑没有删除选项,帮忙删下,再次道歉

我的意思是,CVolObject就是火山视窗程序的基石,动了会出大问题的. 火山编译器里面全部假设对象都是基于CVolObject,所有对象核心处理技术(比较/赋值/序列化等等)也是假设这个前提,现在你非得整一个不是的,那系统该怎么写? 你这么弄自己玩玩可以,要拿来给大众使用肯定是不行的.
回复

使用道具 举报

36

主题

330

帖子

3132

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
3132
9#
发表于 2021-9-30 21:44:47 | 只看该作者
飞扬工作室 发表于 2021-9-30 21:16
我的意思是,CVolObject就是火山视窗程序的基石,动了会出大问题的. 火山编译器里面全部假设对象都是基于CV ...

所以,这就是你不解决“@视窗.结构类”多层嵌套的问题吗?
回复

使用道具 举报

10

主题

169

帖子

1382

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1382
10#
发表于 2021-10-1 00:15:37 | 只看该作者
结构类多层嵌套是十分烦人,只能用内嵌来实现,反正很繁琐,要是有更方便的就好了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 08:05 , Processed in 0.103113 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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