递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[视窗] 关于火山结构类的问题

[复制链接]

16

主题

87

帖子

1087

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1087
跳转到指定楼层
楼主
发表于 2021-6-8 22:42:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 aiyanok 于 2021-6-8 22:46 编辑

假设有个结构  
  • struct jiegou
  • {
  •     int a;
  •     int b;
  •     int c;
  • };
在C++里 如果定义这个结构 那么这个结构的指针假设是 00400000,A的指针就是00400000 B是00400004 C是00400008
但是在火山结构类里 定义同样的结构,这个结构指针是00400000 A的指针却成了0040000C B是00400010 C是00400014
如果在C++里 要操作这个结构的内存,只需要将结构指针指向结构内存即可
比如有内存
00400000 00400004 00400008
1        2        3
p=0x00400000
那么
*p++=3
*p++=2
*p=1
就可以变成
00400000 00400004 00400008
3        2        1


但是在火山里,取变量地址(结构变量)得到的却是火山结构的指针,如果直接把地址覆盖火山对象的指针,比如
写指针处值(取变量地址(结构),0x00400000)
结构.a=3
结构.b=2
结构.C=1
这样操作是不行的
请问如何像C++一样 ,实现结构直接对内存操作?

需要解决2个问题,
第一.如何得到火山结构对象指针内存地址,而不是对象指针指向的数据内存地址,以便更改指针指向的数据地址
第二个,如何解决火山结构成员会相对结构指针偏移 +0C的问题..因为我发现火山结构对象的第一个内存空间的内容,好像是this指针的值
如果直接通过更改对象指针指向的内存地址,缺少this可能会报错


有没有大能能够解释下用法?或者说火山的结构不用类结构的实现方式是怎么样的?只能靠嵌入式方法或者C++代码来实现吗?
IDE没有原生的自定义数据结构方式,只有类自定义数据结构的方式吗?


回复

使用道具 举报

16

主题

87

帖子

1087

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1087
沙发
 楼主| 发表于 2021-6-8 22:45:22 | 只看该作者
本帖最后由 aiyanok 于 2021-6-8 23:01 编辑

我想实现的就是类似以下的方式,不知道是火山不支持,还是我不会用,刚接触火山几天不是很清白,求教各路大神,如何实现

我描述能力比较差,我想要的就是通过改变火山结构对象指针指向的方式,直接指向到内存中其他已有的数据空间以便直接通过结构对象修改其他内存的值,完事之后再把结构对象指向的地址给还原,以防程序崩溃
对象指针=取对象指针(结构对象)//得到对象的指针地址
原数据指针=取变量地址(结构对象)//保存缘来对象指向的数据内存空间
写指针处值(对象指针,0x00400000)//更改对象指针地址的指向,指向到要修改的内存空间
结构.a=3
结构.b=2
结构.C=1
写指针处值(对象指针,原数据指针)//还原对象指针指向到原来的数据内存空间

当让以上代码行不通,只是个形式,就是不知道如何实现

比如获取对象的指针地址,和对象this的问题,不知道如何处理
回复

使用道具 举报

16

主题

87

帖子

1087

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1087
板凳
 楼主| 发表于 2021-6-8 23:15:22 | 只看该作者
其实结构类 可以这样设计  
this
数据结构指针

这样可以直接通过修改数据结构指针指向其他内存空间
但是现在火山结构类的内存里是这样的
this
0
0
成员1
成员2
成员3
......
回复

使用道具 举报

50

主题

509

帖子

2052

积分

金牌会员

Rank: 6Rank: 6

积分
2052
地板
发表于 2021-6-8 23:26:33 来自手机 | 只看该作者
利用读指针对象()就可以华丽的变成对方!然后.成员=什么!就可以改变对方值了!你看下我这两天开源的多线程贴子中的类回调就知了!!
回复

使用道具 举报

16

主题

87

帖子

1087

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1087
5#
 楼主| 发表于 2021-6-8 23:31:49 | 只看该作者
本帖最后由 aiyanok 于 2021-6-8 23:35 编辑
呵呵仙8 发表于 2021-6-8 23:26
利用读指针对象()就可以华丽的变成对方!然后.成员=什么!就可以改变对方值了!你看下我这两天开源的多线程 ...

不是火山的对象 也能这样读? 比如内存里就只有00400000 00400004 00400008
1             2              3
然后定义一个火山类结构
结构 jiegou
a 整数
b 整数
c 整数

测试结构 jiegou

测试结构=读指针处对象(00400000,jiegou)
测试结构.a=3
测试结构.b=2
测试结构.c=1

这样不行吧?
因为内存00400000只是数据空间 而火山的结构是
this
0
0
a
b
c
......
这么操作会因为读取的时候 缺少this而报错..这样应该只能火山结构和火山结构之间的互相变身.
回复

使用道具 举报

50

主题

509

帖子

2052

积分

金牌会员

Rank: 6Rank: 6

积分
2052
6#
发表于 2021-6-8 23:35:56 | 只看该作者
aiyanok 发表于 2021-6-8 23:15
其实结构类 可以这样设计  
this
数据结构指针

的确,易语言就这样的结构!交换4字节指针就起到高效的换值,当然你
把整个结构的字节交换也可以高效的换值,比交换变量()快多了!



回复

使用道具 举报

16

主题

87

帖子

1087

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1087
7#
 楼主| 发表于 2021-6-8 23:37:19 | 只看该作者
我目前想到一个办法就就是很麻烦
@begin
stuct jiegou{
int a,
int b,
};
jieogu a;
@end
然后类_初始化 里用嵌入代码保存这个  jiegou a变量的指针  
在类_清理 里用嵌入代码还原
读取和写入结构数据  就用类的 属性读 和属性写 方法来实现  
只是这样就需要建立大量的属性读和属性写方法..结构数据大的话..特别麻烦
回复

使用道具 举报

50

主题

509

帖子

2052

积分

金牌会员

Rank: 6Rank: 6

积分
2052
8#
发表于 2021-6-8 23:48:36 来自手机 | 只看该作者
你下载看我那个线程池例子看下就知!读指针处对象()就可以变成对方!只要不在前面加=号就不是复制!所以,在静态方法里也能起到类回类或取实例化后的类成员地址!!
回复

使用道具 举报

50

主题

509

帖子

2052

积分

金牌会员

Rank: 6Rank: 6

积分
2052
9#
发表于 2021-6-8 23:58:30 来自手机 | 只看该作者
自定义数据也可以直接复制到内存的!线程池中也有例子!这是企鹅大神教的!
回复

使用道具 举报

16

主题

87

帖子

1087

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1087
10#
 楼主| 发表于 2021-6-9 01:38:00 | 只看该作者
呵呵仙8 发表于 2021-6-8 23:58
自定义数据也可以直接复制到内存的!线程池中也有例子!这是企鹅大神教的! ...

你没理解我的意思.. 我要的不是复制 复制很简单
我要的是通过火山结构体去操作C++结构体
并不是复制来读取
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 12:34 , Processed in 0.091094 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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