现在有一个记录结构:PRecNum=^TecNum;
TRecNum=record
  id: integer;
  name: shortstring;
  str: shortstring;
  hell: array of shortstring;
end;通过new来建立指针数据结构记录并赋值。var pcrn: PRecNum;
new(pcrn);
pcrn.id:=1;
pcrn.name:='harry';
pcrn.str:='create';
pcrn.hell[0]:='ok';现在通过PRecNum(P.data)//这样可以取得P.data指针指向地址数据结构的数据但PRecNum不等于TRecNum也就是说如果有一个函数需要传参数的类型是TRecNum的话,那PRecNum(P.data)是和TRecNum不同,不能传递,应该怎样可以把PRecNum(P.data)转换成TRecNum的不是指针结构类型???

解决方案 »

  1.   

    var
    a:TRecNum;
    begin
    a:=PRecNum(P.data)^;
      

  2.   

    To firetoucher(风焱):   但这样没有将PRecNum(P.data)里的数据赋给a 还是但不到效果
      

  3.   

    有几个错误,修改如下:
    PRecNum=^TRecNum;在调用前应先分配内存:setLength(pcrn^.hell,3);
    pcrn.hell[0]:='ok';对指针变量赋值最好加上^,如:
    pcrn^.id:=1;
    pcrn^.name:='harry';
    pcrn^.str:='create';
    setLength(pcrn^.hell,3);
    pcrn^.hell[0]:='ok';如果你的函数的参数据为TRecNum类型,当将指针类型的变量传入时,应加上^。如下
    procedure test(p: TRecNum);调用:test(PRecNum(P.data)^);最后不要忘了用dispose()释放你创建的指针
      

  4.   

    PRecNum(P.data)^;不行吗?你要达到什么效果?
      

  5.   

    To firetoucher(风焱), citytramper(阿琪):
      不好意思,PRecNum(P.data)^是可以的, 我自己搞错了。To kkk2000(肥牛):
      谢谢你的纠正,另外我想问问如果不加^会不会有什么出错呢?或则隐患呢?
      

  6.   

    pcrn不加^是指向TRecNum结构类型的指针,实际上它是一个32-bit,也就是4Byte的数值,标识一个内存地址值。
    下面的例子你自己比较一下,看看结果。var
      pcrn : PRecNum;
    begin
      new(pcrn);
      showMessage(IntToStr(sizeof(pcrn)));
      showMessage(IntToStr(sizeof(pcrn^))); //TRecNum结构大小
      showMessage(IntToStr(sizeof(@pcrn^))); //实际上 pcrn = @pcrn^
      
      showMessage(IntToStr(DWORD(pcrn))); //指针地址值
      dispose(pcrn);
    end;
      

  7.   

    请问大家在那定义记录结构啊??我在implementation 下定义时编译错误啊???