Point3D = record
x,y,z : double;
end; ppointlist = ^pointlist;
pointlist = array[0..0] of Point3D;Q1. 请问应该怎么去正确使用ppointlist?Q2. 分配空间的时候的时候如果使用 GetMem(ppointlist,n ); //n is the size what I want 返回的ppointlist是 第1个,还是第n个的指针呢?
Q3. 赋值的时候使用过以下的方法,可是总会出错,搞不清楚该怎么使用了。请教大家。 for i:=0 to n-1 do
begin
polypoints^[i].x := P[i].x;
polypoints^[i].y := P[i].y;
polypoints^[i].z := P[i].z; //P : array[0..N] of Point3D
解决方案 »
- 请问如何在点击重新登录按钮后,关闭所有显示的窗体,并显示登录窗体
- 一不小心!!!生星了!!放分庆祝一下!!各位弟兄都有分!!呵呵!!!
- 准备学习delphi,大家有什么好的建议!谢谢拉!
- 散!
- 如何把窗体缩小成任务栏上的图标?
- 用过TWebConnection的朋友请进
- 系统集成?
- 什么是dll?为什么要进行regsvr32?机理是什么?(高分相送)
- 硬盘故障!!!
- delphi+access做出来的软件 和 access 直接做出来的程序 有什么区别?是不是这样的话,用 delphi做出来的程序有些多余?直接用access做算了
- 请教下面这段程序是什么意思.我一点也不懂delphi
- webbrowser中如何让前一个动作完成后才进行下一个动作?
Point3D = record
x, y, z: Double;
end;
var
ppt3D: ^Point3D;
ptlst: TList;
i, nCount: Integer;
begin
nCount := 10;
ptlst := TList.Create;
try
// 生成
for i := 0 to nCount - 1 do begin
New(ppt3D);
ppt3D^.x := i;
ppt3D^.y := i;
ppt3D^.z := i;
ptlst.Add(ppt3D);
end;
// 使用
for i := 0 to nCount - 1 do begin
ppt3D := ptlst.Items[i];
ShowMessage(Format('%f,%f,%f', [ppt3D^.x, ppt3D^.y, ppt3D^.z]));
end;
// 删除
for i := 0 to nCount - 1 do begin
ppt3D := ptlst.Items[i];
Dispose(ppt3D);
end;
finally
ptlst.Free;
end;
end;
{$R-} //*// 取消下标范围判断
type
Point3D = record
x, y, z: Double;
end; PPointList = ^PointList;
PointList = array[0..0] of Point3D;procedure TForm1.Button1Click(Sender: TObject);
const
n = 10;
var
polypoints: PPointList;
p: array[0..n - 1] of Point3D;
I: Integer;
begin
GetMem(polypoints, n * SizeOf(Point3D)); //*// 后面的参数表示分配内存空间的大小,而不是数组的个数。
try
for I := 0 to n - 1 do
begin
polypoints^[I].x := p[I].x;
polypoints^[I].y := p[I].y;
polypoints^[I].z := p[I].z;
end;
finally
FreeMem(polypoints, n * SizeOf(Point3D));
end;
end;
不过,在已经存在的代码上再开发,只能这样了。
也不知道为什么前人这么做,应该有原因的吧。To zswang: 我开始也使用的方法跟你提供的代码是一样的。不过会出现莫名其妙的错误。后来改成了如下: (仅循环部分,其他相同) for I := 0 to n - 1 do
begin
inc(polypoints,i);
polypoints^[0].x := p[I].x;
polypoints^[0].y := p[I].y;
polypoints^[0].z := p[I].z;
dec(polypoints,i);
end; 结果就Ok了。不过原理却变得更加不明白了。
dec(polypoints,i); // 移回开头
这两句就是在移动指针,逻辑上当然OK.
至于你说用前面的方法就会出现"莫名其妙的错误",确实不解.
描述一下具体是什么样的错误.
polypoints^[I].y := p[I].y;
polypoints^[I].z := p[I].z;则,只能对第一个赋值,即polypoints^[0]。其他的就会出现内存地址接入错误。
应该是你原来自己代码的问题吧.
pointlist = array[0..0] of Point3D; 类似的与
ppointlist = ^pointlist;
pointlist = array[0..MAXINT] of Point3D; 在声明上面是没有任何差别的,反倒是前者可能难以逃离编译器选项当中的Over flow检测机制。目的是声明一个PointList类型,告诉编译器,它是一个Point3D类型的数组,从而可以使用
PointList[Index]的方式来进行访问。
对于任何数据,实际上就只是一段内存信息,类型只是一个数据结构。从而你可以把任何大小的内存,看作是任何小于等于其大小的数据结构来看待。
在此当中, GetMem(ppointlist,n ); 是尝试为ppointlist分配n字节的内存,由于要按照一定结构进行访问,那么就要求n是按ppointlist的访问单元对齐的,否则会造成内存溢出。基于你的上下文当中对于N的使用,很显然,你是想要有N个这样的访问单元结构,于是zswang就帮你修正了一下,你申请的内存应该是这个单元逻辑结构大小的N倍,而不是N个字节。