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 
  

解决方案 »

  1.   

    要动态的,建议你用TList.type
      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;
      

  2.   

    而要设置array的长度则应该用SetLength(pointlist, n).
      

  3.   

    参考如下代码:
    {$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;
      

  4.   

    嗯,其实俺也是习惯了使用,SetLength或是TList。
    不过,在已经存在的代码上再开发,只能这样了。
    也不知道为什么前人这么做,应该有原因的吧。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了。不过原理却变得更加不明白了。         
      

  5.   

    inc(polypoints,i); // 后移到第i个对象
    dec(polypoints,i); // 移回开头
    这两句就是在移动指针,逻辑上当然OK.
    至于你说用前面的方法就会出现"莫名其妙的错误",确实不解.
    描述一下具体是什么样的错误.
      

  6.   

    就是在这段代码中,如果使用如下描述      polypoints^[I].x := p[I].x;
          polypoints^[I].y := p[I].y;
          polypoints^[I].z := p[I].z;则,只能对第一个赋值,即polypoints^[0]。其他的就会出现内存地址接入错误。
      

  7.   

    楼主你有仔细看过上面zswang贴出的代码吗?完全正确没有错误.
    应该是你原来自己代码的问题吧.
      

  8.   

      ppointlist = ^pointlist; 
      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个字节。