送分题:初始化数组

okyzx 2007-04-22 03:07:49
我有一个动态数组Ball长度共 4531
现在要给他分配不同的数据值,例如下数据,A1,A2,A3,A4,A5分别存放1、10、20、500、1000
3000
请问用语句如何实现初始化下面的值 ,谢谢

1 个 1
10 个 2
20 个 3
500 个 4
1000 个 5
3000 个6
...全文
201 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
okyzx 2007-04-22
  • 打赏
  • 举报
回复
谢谢楼上的
lihuasoft 2007-04-22
  • 打赏
  • 举报
回复
是的,就是在说全局对象。局部对象也是一样的道理。
lihuasoft 2007-04-22
  • 打赏
  • 举报
回复
关于“动态数组元素是不是在内存中连续存放的”:

动态数组和动态字符串的管理机制是一样的,就是叫做“Copy On Write”的技术。这方面我理解得不深,只能简要地表达一下我的看法:

动态字符串对象和动态数组对象都在起始指针偏移-8个字节处放置一个叫做“引用计数”的4字节integer数据。以string为例:

当S := DateTimeToStr(Now);
然后,S2 := S; 时,S的引用计数加1,此时,S2与S指向同样的堆空间。

当S2 := 'abcd' + S; 时,系统重新给S2分配堆空间,并把'abcd'和S的内容拷贝过去,S的引用计数减1。

下面用代码演示动态数组的地址变化:

var
A : array of byte;

procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.Add(Format('%p',[A]));//未设定长度时,系统并未给A分配堆内存
SetLength(A, 100);
Memo1.Lines.Add(Format('%p',[A]));
SetLength(A, 1000);
Memo1.Lines.Add(Format('%p',[A]));
SetLength(A, 10000000);
Memo1.Lines.Add(Format('%p',[A]));
SetLength(A, 12345678);
Memo1.Lines.Add(Format('%p',[A]));
end;

可以看出,每次改变长度,数组的起始地址都有变化,也就是说,数组被“拷贝”了。

理解不对之处,不要笑话。总之我认为动态数组元素在内存中是连续排放的。(并且,如果不是连续存放的,那么每个元素的地址在哪里标记?)
okyzx 2007-04-22
  • 打赏
  • 举报
回复
to楼上:
全局的动态数据也是么?
lihuasoft 2007-04-22
  • 打赏
  • 举报
回复
数组在内存中是连续存放的
okyzx 2007-04-22
  • 打赏
  • 举报
回复
我这个Ball动态数组是全局的,会不会出现内存不连续用,FillChar填充出问题的情况?
lihuasoft 2007-04-22
  • 打赏
  • 举报
回复
var
Ball : array of byte;//动态数组
A1,A2,A3,A4,A5,A6 : integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
A1:=1; A2:=10; A3:=20; A4:=500; A5:=1000; A6:=3000;
SetLength(Ball,A1+A2+A3+A4+A5+A6);//长度
FillChar(Ball[Low(Ball)],A1,1);
FillChar(Ball[Low(Ball)+A1],A2,2);
FillChar(Ball[Low(Ball)+A1+A2],A3,3);
FillChar(Ball[Low(Ball)+A1+A2+A3],A4,4);
FillChar(Ball[Low(Ball)+A1+A2+A3+A4],A5,5);
FillChar(Ball[Low(Ball)+A1+A2+A3+A4+A5],A6,6);
end;

若论API,CopyMemory似乎还不如FillMemory呢。其实是一样的思路。
lihuasoft 2007-04-22
  • 打赏
  • 举报
回复
动态数组的内存不一定连续吧

应该是连续的。
superyys 2007-04-22
  • 打赏
  • 举报
回复
动态数组的内存不一定连续吧?还是用for语句一个一个赋值比较保险吧
可以low和high得到数据的下标和上标,遂个赋值不是难事!
如果不是动态数据Ball : array[1..4531] of byte;,可以用fillchar,StringOfChar,DupeStriing,CopyMemory,一大把函数可以用了,CopyMemory应该是最快的,API吗
lihuasoft 2007-04-22
  • 打赏
  • 举报
回复
var
Ball : array[1..4531] of byte;
A1,A2,A3,A4,A5,A6 : integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
A1:=1; A2:=10; A3:=20; A4:=500; A5:=1000; A6:=3000;
FillChar(Ball[Low(Ball)],A1,1);
FillChar(Ball[Low(Ball)+A1],A2,2);
FillChar(Ball[Low(Ball)+A1+A2],A3,3);
FillChar(Ball[Low(Ball)+A1+A2+A3],A4,4);
FillChar(Ball[Low(Ball)+A1+A2+A3+A4],A5,5);
FillChar(Ball[Low(Ball)+A1+A2+A3+A4+A5],A6,6);
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧