关于内存操作的问题,帮帮忙看看,分不够可在加!!!

lbywyj 2004-05-04 05:04:48
定义一个结构,
s= packed record
a:integer;
b:string;
c:real;
.
.
.
end;
结构的大小为90个字节
我要进行的操作是:把这个结构放到内存中去,然后对它进行读或者写,
问题:1:怎么申请内存块?
2:我读取或写其中的任意一个值,怎么定位?
3:我要把结构按照每16个字节或32个字节来划分,放到另外一个内存块中(这个块是以16或32个字节为单位的)?
4:我在操作时候最应该注意那些问题?

再说一遍,分不够了,我再加!!!
...全文
37 15 点赞 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
miky 2004-05-08
首先,record中的 b: String;String 在delphi中是一个指针,故而,在动态数组申请内存的时候应该首先申请数组的内存,而后再为string单独获得长度。这样的话,你还不如将b:String的申明改成b:pchar或者array[0..xxx]of char.
------------------------------------------------------------
楼主定死90字节了,你这样不太好吧?
  • 打赏
  • 举报
回复
数字蛋糕 2004-05-08
如果你直接用ShortString而不是String的话,你就能够非常简单的操作它了。
  • 打赏
  • 举报
回复
Eastunfail 2004-05-07
delphijoe(delphijoe)

你用CopyMemory复制内存结果把指针放到新结构中了,那说明你用错了,你把指针的指针传给CopyMemory了
  • 打赏
  • 举报
回复
飞翔的老虎 2004-05-07
首先,record中的 b: String;String 在delphi中是一个指针,故而,在动态数组申请内存的时候应该首先申请数组的内存,而后再为string单独获得长度。这样的话,你还不如将b:String的申明改成b:pchar或者array[0..xxx]of char.
2:我读取或写其中的任意一个值,怎么定位?
你可以参见 Eastunfail(龙子龙孙)==(恶鱼杀手) 的方法
3:我要把结构按照每16个字节或32个字节来划分,放到另外一个内存块中(这个块是以16或32个字节为单位的)?
这个问题有点问题:)因为String是一个指针,呵呵,copymemory将只会将指针放到新的结构中,而不会将内容复制。如果使用arrau[0..xxx]of char的方式,就没有这个问题。
4:我在操作时候最应该注意那些问题?
个人觉得一定要实现上面的功能,最好自己定义一个类,那样的话,你的灵活度可能很高。


  • 打赏
  • 举报
回复
Eastunfail 2004-05-07
1:怎么申请内存块?
TPackage类中用实例的PackageInstance属性来申请、释放某个结构大小的内存块,或者用lxcMemoryManager.pas中的不同的内存类来分配不同类型的内存
2:我读取或写其中的任意一个值,怎么定位?
TPackage的Access******系列属性
3:我要把结构按照每16个字节或32个字节来划分,放到另外一个内存块中(这个块是以16或32个字节为单位的)?
没相隔16/32个字节用CopyMemory来复制
4:我在操作时候最应该注意那些问题?
用完TPackage后别忘了Free
  • 打赏
  • 举报
回复
Eastunfail 2004-05-07
作个广告,呵呵
到我个人主页 www.yixel.com
下载LexLib,使用lxcPackage.pas里面的TPackage类,看是否能够解决楼主的燃眉之急
可以运行时根据字段名称(是string类型的哦~~)来读写字段,也可以运行时生成某个结构体(可以是纯动态的,甚至是你编写代码的时候无法预知的结构),
  • 打赏
  • 举报
回复
fsybaby 2004-05-07
UP
  • 打赏
  • 举报
回复
ekin 2004-05-05
getmem
  • 打赏
  • 举报
回复
yimily 2004-05-05
定义个指向结构的指针
  • 打赏
  • 举报
回复
johnzhangbit 2004-05-05
关注。。。!
  • 打赏
  • 举报
回复
fj218 2004-05-04
b:string;
这里b这是一个指针,字符串内容没有包含,只是将指针读入内存,而指针是可变的,你这样读入没有含义。你可以考虑用动态数组或TMemoryStream
  • 打赏
  • 举报
回复
ailibuli 2004-05-04
type
PRecord = ^TMyRecord;
TMyRecord = record
a: Integer;
b: String;
c: Real;
end;

var
MyList: TList;
PR: PRecord;

procedure TForm1.FormShow(Sender: TObject);
begin
MyList := TList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
MyList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
New(PR);
PR.a := 1;
PR.b := 'Name';
PR.c := 100;
MyList.Add(PR);
//...
end;

MyList.Insert(Index,Item);//挿入
MyList.IndexOf(Item); //定位

(注:具体的使用方法看看TList)
  • 打赏
  • 举报
回复
miky 2004-05-04
为什么要这么麻烦?

s= packed record
a:integer;
b:string;
c:real;
.
.
.
end;
PS = ^S;


ss: Ps;

new(SS);//分配内存;
SS.a := 100;
ss.b := 'abc';
...........
  • 打赏
  • 举报
回复
sousouwjh 2004-05-04
你可定意一個類!在它的公有部分定意以上的各種變量!
例如:
Twjh = class
public
s:string;
i:integer;
end;
到時這樣使用:
procedure TForm1.Button1Click(Sender: TObject);
var
wjh1:Twjh;
begin
wjh1:=Twjh.Create;
wjh1.s:='fdsf';
showmessage(wjh1.s)
end;
  • 打赏
  • 举报
回复
lbywyj 2004-05-04
还有,我每次操作时,必须把另一个内存(就是上面提到的以16或32个字节为单位的那个块)中的有关这个完整的结构的数据都读出来,组合成一个完整的结构,然后对结构中的数据进行修改,在写入到另外的那个内块(就是上面提到的以16或32个字节为单位的那个块)中去,该怎样实现?
  • 打赏
  • 举报
回复
相关推荐
发帖
Delphi
加入

4972

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2004-05-04 05:04
社区公告
暂无公告