火山软件开发平台

标题: ★ 重要知识点记录,关于结构体。 [打印本页]

作者: urenai    时间: 2022-7-13 19:37
标题: ★ 重要知识点记录,关于结构体。
有些人吐槽结构体的一些问题。连memcpy都不行。
那是错误的。是不对的。
在实际运用当中,我发现结构体是不能直接运用结构体指针的。
因为结构体指针!=结构体起始成员内存地址指针。
意思是,结构体指针+24(好像是)才=第一个成员的指针。
那我们在实际运用中,可以在嵌入代码中,
先声明目的 类型变量 例如:@ RECT _rect;

在调用 @ bool _bool =(bool)GetWindowRect((HWND)@<句柄>,&_rect);//这是一句非常正常的嵌入代码。
下一步就是将_rect里面的矩形参数成员拷贝出来。

如果直接调用 @ memcpy(&@<矩形>,&_rect,sizeof(_rect));// 这样肯定是不对的。因为  矩形这个结构没有被正确引用。
正确的引用方法应该是@ memcpy(&@<矩形.左边>,&_rect,sizeof(_rect));// 这样才会正确的把嵌入的结构体输入复制到火山结构里。

完毕。



作者: 2oon    时间: 2022-7-14 07:53
看不懂  感觉很牛逼
作者: shuimiao    时间: 2022-7-14 08:27
如果这样的话,为啥老吴不把结构体指针弄的直接一点
作者: Xelloss0618    时间: 2022-7-14 08:46
纠正一下,你取的是火山类成员变量的地址,并不是结构体的。
+24是32位火山基本类的头大小,64位又是另一个大小了。

这里先给一个结论,不能直接把火山类的成员变量当作结构体使用。
因为结构类成员变量和结构体的内存字节对齐可能会不一样,
就是具体的偏移地址会不同,直接用肯定会出错。

结构类只是在内部定义了一个名为 S 的真结构体,但这个结构体是不会自动创建的,所以你无法通过结构类的地址访问这个结构体。
你必须创建 S 结构体的变量,它才会分配到内存。
既然都用到嵌入式了,就直接用结构类的 SetStruct 和 GetStruct 吧。
作者: urenai    时间: 2022-7-14 10:04
Xelloss0618 发表于 2022-7-14 08:46
纠正一下,你取的是火山类成员变量的地址,并不是结构体的。
+24是32位火山基本类的头大小,64位又是另一个 ...

对啊对啊,@创世魂 抽空把那些内部函数搞个笔记就好了, SetStruct 和 GetStruct 我还头一回见。
作者: Xelloss0618    时间: 2022-7-14 10:20
urenai 发表于 2022-7-14 10:04
对啊对啊,@创世魂 抽空把那些内部函数搞个笔记就好了, SetStruct 和 GetStruct 我还头一回见。 ...

这些看封装手册,里面有写,结构类属性的备注里也有写
作者: jiaozhu    时间: 2022-7-14 12:13
Xelloss0618 发表于 2022-7-14 10:20
这些看封装手册,里面有写,结构类属性的备注里也有写

老哥 能出个 怎么使用S 结构体的变量    SetStruct 和 GetStruct   就用这个  @ RECT _rect; 矩形演示个例子吗 谢谢了
作者: Xelloss0618    时间: 2022-7-14 12:38
jiaozhu 发表于 2022-7-14 12:13
老哥 能出个 怎么使用S 结构体的变量    SetStruct 和 GetStruct   就用这个  @ RECT _rect; 矩形演示个 ...

@ RECT stRect;
// 下一句是将火山矩形类的成员变量赋值到结构体 stRect 里,这一步对 GetWindowRect 没有意义,仅做演示
@ @<矩形>.GetStruct ((@dt<矩形类>::S *)&stRect);
@ BOOL bRes = GetWindowRect ((HWND)@<窗口句柄>, &stRect);
// 将结构体 stRect 的数据赋值到火山结构类变量中
@ @<矩形>.SetStruct ((@dt<矩形类>::S *)&stRect);
@ return bRes;
作者: tmf19901124    时间: 2022-7-14 12:45
不要用火山的结构类!不要用火山的结构类!不要用火山的结构类!重要的事情说三遍!
作者: jiaozhu    时间: 2022-7-14 12:50
Xelloss0618 发表于 2022-7-14 12:38
@ RECT stRect;
// 下一句是将火山矩形类的成员变量赋值到结构体 stRect 里,这一步对 GetWindowRect 没有 ...

感谢老哥
作者: hcwanz    时间: 2022-7-14 12:55
tmf19901124 发表于 2022-7-14 12:45
不要用火山的结构类!不要用火山的结构类!不要用火山的结构类!重要的事情说三遍! ...

建议再说三十遍,或者说点实际的,不然未必有人听
作者: 创世魂    时间: 2022-7-14 13:13
urenai 发表于 2022-7-14 10:04
对啊对啊,@创世魂 抽空把那些内部函数搞个笔记就好了, SetStruct 和 GetStruct 我还头一回见。 ...

这个太高级了。。要后面有空专门来弄。现在主要弄基础手册
作者: tmf19901124    时间: 2022-7-14 14:35
hcwanz 发表于 2022-7-14 12:55
建议再说三十遍,或者说点实际的,不然未必有人听

没人听不要紧,踩坑了就知道老司机的忠告了。。。。。。。。。。。。
作者: jiaozhu    时间: 2022-7-14 16:22
tmf19901124 发表于 2022-7-14 14:35
没人听不要紧,踩坑了就知道老司机的忠告了。。。。。。。。。。。。

如果说不用自带的结构体,那么上面那个要怎么解决这个最简单的 rect 结构体的问题呢,不管怎么内嵌,最终还是要传到火山本地变量上啊,本地变量又只能用结构体,哥们有什么好的方式能推荐吗,
作者: tmf19901124    时间: 2022-7-14 19:31
jiaozhu 发表于 2022-7-14 16:22
如果说不用自带的结构体,那么上面那个要怎么解决这个最简单的 rect 结构体的问题呢,不管怎么内嵌,最终还 ...

嵌入c++结构体+火山的属性读写,缺点就是封装慢,优点是使用舒服,彻底解决内存对齐,各种嵌套,各种数组问题。

作者: urenai    时间: 2022-7-14 21:36
tmf19901124 发表于 2022-7-14 19:31
嵌入c++结构体+火山的属性读写,缺点就是封装慢,优点是使用舒服,彻底解决内存对齐,各种嵌套,各种数组 ...

哦哦哦,我草,对啊,嵌套的用memcpy没有啊,没法对齐啊、
作者: 龙纹    时间: 2022-7-17 21:12
Xelloss0618 发表于 2022-7-14 08:46
纠正一下,你取的是火山类成员变量的地址,并不是结构体的。
+24是32位火山基本类的头大小,64位又是另一个 ...

纠正纠正一下(笑)并补充一点细节,火山基本类,即 CVolObject,定义在 vol_object.h 头文件中。这个类有一个虚函数表指针、一个 UINT_P 成员变量、一个 INT_P 成员变量,三者大小都是 32 位下占4字节,64 位下占8字节,所以这个类在32位下是12字节,64位下才是24字节。




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