递归火山软件开发平台

标题: 关于火山结构类的问题 [打印本页]

作者: aiyanok    时间: 2021-6-8 22:42
标题: 关于火山结构类的问题
本帖最后由 aiyanok 于 2021-6-8 22:46 编辑

假设有个结构  在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没有原生的自定义数据结构方式,只有类自定义数据结构的方式吗?



作者: aiyanok    时间: 2021-6-8 22:45
本帖最后由 aiyanok 于 2021-6-8 23:01 编辑

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

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

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

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

作者: aiyanok    时间: 2021-6-8 23:15
其实结构类 可以这样设计  
this
数据结构指针

这样可以直接通过修改数据结构指针指向其他内存空间
但是现在火山结构类的内存里是这样的
this
0
0
成员1
成员2
成员3
......
作者: 呵呵仙8    时间: 2021-6-8 23:26
利用读指针对象()就可以华丽的变成对方!然后.成员=什么!就可以改变对方值了!你看下我这两天开源的多线程贴子中的类回调就知了!!
作者: aiyanok    时间: 2021-6-8 23:31
本帖最后由 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而报错..这样应该只能火山结构和火山结构之间的互相变身.
作者: 呵呵仙8    时间: 2021-6-8 23:35
aiyanok 发表于 2021-6-8 23:15
其实结构类 可以这样设计  
this
数据结构指针

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




作者: aiyanok    时间: 2021-6-8 23:37
我目前想到一个办法就就是很麻烦
@begin
stuct jiegou{
int a,
int b,
};
jieogu a;
@end
然后类_初始化 里用嵌入代码保存这个  jiegou a变量的指针  
在类_清理 里用嵌入代码还原
读取和写入结构数据  就用类的 属性读 和属性写 方法来实现  
只是这样就需要建立大量的属性读和属性写方法..结构数据大的话..特别麻烦
作者: 呵呵仙8    时间: 2021-6-8 23:48
你下载看我那个线程池例子看下就知!读指针处对象()就可以变成对方!只要不在前面加=号就不是复制!所以,在静态方法里也能起到类回类或取实例化后的类成员地址!!
作者: 呵呵仙8    时间: 2021-6-8 23:58
自定义数据也可以直接复制到内存的!线程池中也有例子!这是企鹅大神教的!
作者: aiyanok    时间: 2021-6-9 01:38
呵呵仙8 发表于 2021-6-8 23:58
自定义数据也可以直接复制到内存的!线程池中也有例子!这是企鹅大神教的! ...

你没理解我的意思.. 我要的不是复制 复制很简单
我要的是通过火山结构体去操作C++结构体
并不是复制来读取
作者: aiyanok    时间: 2021-6-9 01:52
呵呵仙8 发表于 2021-6-8 23:58
自定义数据也可以直接复制到内存的!线程池中也有例子!这是企鹅大神教的! ...

举个例子
比如有个
类 C 里面分别有3个成员 ABC

取指针处对象(C).A
再取变量地址能够获取到A的地址 这没错 你也可以读取 也可以通过地址去修改A的值
但是也仅限于此
如果
假设内存里有3个数据
00400000  00400004 00400008
1              2             3
你没办法通过这个C类直接去修改这3个地址的数据
不能 c.a=3 去把00400000的数据修改成3
而C++就很容易
c *p;
p=(c*)0x00400000
c->a=3
就行了
这下应该明白我的意思了吧
作者: 创世魂    时间: 2021-6-9 08:32
aiyanok 发表于 2021-6-9 01:38
你没理解我的意思.. 我要的不是复制 复制很简单
我要的是通过火山结构体去操作C++结构体
并不是复制来读 ...

????火山结构体操作c++结构体??   把c++结构体封装进来就可以操作了。。
作者: 暴风    时间: 2021-6-9 08:35
(, 下载次数: 55)

看似可以, 感觉会出问题

作者: aiyanok    时间: 2021-6-9 10:36
暴风 发表于 2021-6-9 08:35
看似可以, 感觉会出问题

也只有你看明白我说的意思了,现在我就是不确定这样做有没有安全风险
我现在的实现方法是用内嵌C++代码实现,定义一个常量表,把常量表里代表的序号当做指针的偏移量,当结构体传入C++函数来读写
作者: 伟业    时间: 2021-6-9 14:30
都是牛人
作者: qaz2428119    时间: 2021-6-26 13:46
火山 根本就没有结构体,你又何来的直接操作结构体,只能通过类模拟操作,
其实这也是一大遗憾,C 的大多数特性火山都不支持,就算是火山的类,也是一个半残废品,C++类强大就强大在重载,可火山不支持
作者: cxz7411    时间: 2021-8-14 06:40
我也遇到这个问题,火山的结构类限制太多,而且在内存中不连续存放.和c++的结构不一样.无法像c++一样的操作.希望官方可以考虑改进




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