火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[视窗] ★ 重要知识点记录,关于结构体。

[复制链接]

302

主题

1363

帖子

5250

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5250
QQ
跳转到指定楼层
楼主
发表于 2022-7-13 19:37:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
有些人吐槽结构体的一些问题。连memcpy都不行。
那是错误的。是不对的。
在实际运用当中,我发现结构体是不能直接运用结构体指针的。
因为结构体指针!=结构体起始成员内存地址指针。
意思是,结构体指针+24(好像是)才=第一个成员的指针。
那我们在实际运用中,可以在嵌入代码中,
先声明目的 类型变量 例如:@ RECT _rect;

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

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

完毕。


专业承接18-98岁xx的心理及生理教育辅导。
回复

使用道具 举报

11

主题

214

帖子

1633

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1633
沙发
发表于 2022-7-14 07:53:06 | 只看该作者
看不懂  感觉很牛逼
回复

使用道具 举报

367

主题

2241

帖子

7281

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
7281
板凳
发表于 2022-7-14 08:27:18 来自手机 | 只看该作者
如果这样的话,为啥老吴不把结构体指针弄的直接一点
回复

使用道具 举报

26

主题

1465

帖子

5523

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5523
地板
发表于 2022-7-14 08:46:51 | 只看该作者
纠正一下,你取的是火山类成员变量的地址,并不是结构体的。
+24是32位火山基本类的头大小,64位又是另一个大小了。

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

结构类只是在内部定义了一个名为 S 的真结构体,但这个结构体是不会自动创建的,所以你无法通过结构类的地址访问这个结构体。
你必须创建 S 结构体的变量,它才会分配到内存。
既然都用到嵌入式了,就直接用结构类的 SetStruct 和 GetStruct 吧。
回复

使用道具 举报

302

主题

1363

帖子

5250

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5250
QQ
5#
 楼主| 发表于 2022-7-14 10:04:55 | 只看该作者
Xelloss0618 发表于 2022-7-14 08:46
纠正一下,你取的是火山类成员变量的地址,并不是结构体的。
+24是32位火山基本类的头大小,64位又是另一个 ...

对啊对啊,@创世魂 抽空把那些内部函数搞个笔记就好了, SetStruct 和 GetStruct 我还头一回见。
专业承接18-98岁xx的心理及生理教育辅导。
回复

使用道具 举报

26

主题

1465

帖子

5523

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5523
6#
发表于 2022-7-14 10:20:03 | 只看该作者
urenai 发表于 2022-7-14 10:04
对啊对啊,@创世魂 抽空把那些内部函数搞个笔记就好了, SetStruct 和 GetStruct 我还头一回见。 ...

这些看封装手册,里面有写,结构类属性的备注里也有写
回复

使用道具 举报

10

主题

169

帖子

1382

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1382
7#
发表于 2022-7-14 12:13:31 | 只看该作者
Xelloss0618 发表于 2022-7-14 10:20
这些看封装手册,里面有写,结构类属性的备注里也有写

老哥 能出个 怎么使用S 结构体的变量    SetStruct 和 GetStruct   就用这个  @ RECT _rect; 矩形演示个例子吗 谢谢了
回复

使用道具 举报

26

主题

1465

帖子

5523

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5523
8#
发表于 2022-7-14 12:38:10 | 只看该作者
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;
回复

使用道具 举报

7

主题

240

帖子

1891

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1891
9#
发表于 2022-7-14 12:45:21 | 只看该作者
不要用火山的结构类!不要用火山的结构类!不要用火山的结构类!重要的事情说三遍!
回复

使用道具 举报

10

主题

169

帖子

1382

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1382
10#
发表于 2022-7-14 12:50:20 | 只看该作者
Xelloss0618 发表于 2022-7-14 12:38
@ RECT stRect;
// 下一句是将火山矩形类的成员变量赋值到结构体 stRect 里,这一步对 GetWindowRect 没有 ...

感谢老哥
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:05 , Processed in 0.089762 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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