[求助]关于Record类型的一些问题 ( 积分: 100 )

  • 主题发起人 主题发起人 psycholo
  • 开始时间 开始时间
P

psycholo

Unregistered / Unconfirmed
GUEST, unregistred user!
这个问题困扰在下很久了……在下在做很多东西的时候都会碰到这种情况:有一个基本的Record形态(或者Class),例如:
R = Record //或者Class
a: integer;
b: boolean;
c: integer;
d: boolean;
...
z: Boolean;
end;
然后 var a, b: R;
假设在下在初始状态a, b的所有值都是相等的,当在下改变了部分b的值之后(改变的部分未知,a~z都可能,可复选),想把b中仅改变的值赋给a, 同时由于R中可能会有更多的结构个数,a和b进行逐一比较效率会比较低下,因此在下希望求得一个高效率的办法。必要的话尽请改变R的结构(在基本结构的基础上)。
在下不才,希望在指点在下的同时描述的尽可能清楚一点,最好能有举例,供在下鉴赏品味。在此在下深表感谢。

再补充一下:问题的关键之一是如何让a知道b改变了哪些内容,因为在下还可能对a和b作加法,减法,等等。也许条件苛刻了点,请各位高手多担待。
 
我的建议是用class来做,每个成员用属性write方法设置变更的字段,copy完更改的内容后,再重置记录用的数组。(如果成员过多则不是很合适)
TR=class
private
fa:Integer;
fb:Boolean;
fc:Double;
fe:Integer;
{...}
procedure SetFa(const Value: Integer);
function GetChgArry(idx: Integer): Boolean;
protected
//用于记录变更的成员序号,如fa为1,fb为2...
FChgArry:array [1..4] of Boolean;
public
procedure CopyOver;
property a:Integer read fa write SetFa;
{fb/fc/...}
property ChgArry[idx:Integer]:Boolean read GetChgArry;
end;

{ TR }

procedure TR.CopyOver;
begin
FillChar(FChgArry,SizeOf(FChgArry),0);
end;

function TR.GetChgArry(idx: Integer): Boolean;
begin
Result:=FChgArry[idx];
end;

procedure TR.SetFa(const Value: Integer);
begin
fa:=Value;
FChgArry[1]:=True;
end;
 
我建议这样定义这样的Class,其中包括两个数据组,其一为变体类型,用于存放数据,其二为boolean类型,用于存放哪项数据是否改变的标志,定义一个存入数据的过程,当某一数据改变时,给第二个数组的相应项置数,这样当要把b中的改变项赋给a时,可以先判断标志数组再进行,效率应有所提高.
 
To cmd9x & jinguang:
十分感谢2位的作答。在下仔细研究后发现,2位的思路大致相同。在比较结构较小的Class时这的确是一个简单又相对高效的办法。不过由于在下将要进行赋值的Class(或者Record)中结构比较复杂,结构数量比较多,逐一用If去判断一个个Boolean显然不够效率。不知能有什么更高效的办法么?在下愚见……
 
1、可以在改变b的值时调用某一指定的方法来实现,并在这个方法中同步更新a的对应值;
2、用一个variant数组来保存你的这些值,然后你可以用一个TList来保存那些改变了值的索引,最后统一更新(这样只会更新改变的部分),对已更新过的则将索引从TList中移除。
另外说一句,不知你的结构有多复杂?就算有1000个成员吧,用一个循环去执行1000次查找根本就费不了多少时间。
 
To dreamisx:
第一种方法:显然,假设我要动态创建a,b,甚至出现一个c的话就无法实现了

第二种方法:的确,在下也曾经想到过,但是在下不才,如何保存那些“改变了值的索引”?举个例子,在b中我改变了x,y,z,如何将这些改变了的变量存放到一个TList中,使得最后统一更新逐一取出的时候a能直接跳到x,y,z这3个变量获取修改的值?应该不是在TList中直接打上“x,y,z”吧……所以由于在下的愚昧,请您举例说明,最好有代码或伪代码

最后,假设在一台未知配置的机器上(可能低至256内存,OS WindowsXP),在下执行这个循环1000次或者少至100次的查找之后,再进行一些必要的运算的话,可能会出现至少1~2秒钟的无响应状态,这是我不希望看到的。比如在设计游戏中,这种无响应足以是致命伤。同时,在下部认为没有必要为这种赋值工作开多线程。因此恕在下愚见,这种方法不可行。

但是还是要感谢您的热诚以及为在下指出的那些问题,谢谢。
 
a,b初始化都是一样的, 想把b中改变的值赋给a
这和把整个b赋给a没区别吧?
用指针不可以吗 需要赋值时 直接把a指向b
 
帮你顶一下,接个分
 
To themars:
用指针当然可以,不过在下以为,不是这么个用法。因为直接把a指向b会导致一个情况:当b再作改变时,a所指向的值会也跟着一起改变。所以这个方法不能够达到要求,但是谢谢您的回答。

To lcmlhs:
在下谢谢您的好意

再补充一下:问题的关键之一是如何让a知道b改变了哪些内容,因为在下还可能对a和b作加法,减法,等等。也许条件苛刻了点,请各位高手多担待。
 
如果你想花最少的钱学习流行的计算机技术,本人低价提供
计算机专业高清晰 视 频 教 程,所有教程由业内名家讲解,物超所值,
所有光盘4元/张,特快专递全国三天内到货.
联系方式:手 机:1 3 5 76145612(手机联系佳) Q Q:108410943
E-mail:ncncldjjg@126.com
1、Oracle9iOCP(Oracle认证专家DBA)视频教程(23CD)
2、SQL语言、数据挖掘、SQLServer2000视频教程(6CD)
3、计算机网络原理视频教程(4CD)
4、计算机实用组网技术视频教程(3CD)
5、MCSE(微软认证系统工程师)认证视频教程(11CD)
6、windows2003即学即会视频教程(6CD)
7、J2EE Web程序开发定向班/Java就业班视频教程
(java基础jsp核心技术UML设计)(13CD)
8、J2EE基础高级案例分析视频教程(9CD)
9、马士兵J2SE入门与精通(含坦克大战、BBS实例)视频教程(6CD)
10、java语言深入详解视频教程(12CD)
11、java技术从入门到精通视频教程(21CD)
12、javascript全接触视频教程(13CD)
13、各类网站源程序(9CD)
14、unix原理视频教程(3CD)
15、Linux软件开发工程师(C语言)视频教程(4CD)
16、Linux配置、管理、优化实战工程师视频教程(8CD)
17、Linux内核编程视频教程(11CD)
18、C语言详解视频教程(2CD)
19、VC++6.0(MFC)开发技术术详解视频教程(6CD)
20、ASP.NET中文视频教程(3CD)
21、洪恩C#入门多媒体教程(1CD)
22、XML技术视频教程(2CD)
23、操作系统视频教程(3CD)
24、网络技术基础视频教程(2CD)
25、数据结构视频教程(5CD)
26、清华大学计算机专业多媒体教程(数据结构、汇编、编译原理等)(13CD)
27、大学数学[离散数学线性代数概率与数理统计微积分]视频教程(22CD)
28、LearnKey Asp.Net (老外用英语讲课)(13CD)
29、LearnKey Asp.Net Webservice(老外用英语讲课)(5CD)
30、AppDev Asp.Net2.0 UsingC# (老外用英语讲课)(1CD)
31、APPDev .Net Framework(老外用英语讲课)(2CD)
32、林清安pro/e2001(野火版)视频教程(18CD)
33、深圳大学3D设计视频教程(4CD)
34、3DMAX建模视频教程(老外用英语讲课)(6CD)
35、3DMAX纹理与贴图材质灯光视频教程(老外用英语讲课)(5CD)
36、3DMAX格式500个常用模型库(4CD)
37、lightscape基础入门视频教程(2CD)
38、聚光制造(lightscape3.2入门与精通视频教程)(4CD)
39、coreldraw12中文版入门与精通swf格式视频教程(2CD)
 
直接用move

move(a, b, sizeof(b))
反正只是数据同步,应该比较快吧
 
To 52free:
谢谢您给出的函数。不过在下以为,这只是一个简单的Copy过程,虽然效率相对较高……不过在下希望进行比较后根据不同处进行Copy……
 
后退
顶部