type
  posrecord=record
    name:array[1..8] of char;
  end  bufferarry=array of posrecordvar
  fbufferarry:bufferarry;
  p:^Posrecord;
  i:integer;
  recrecord:Posrecord;
begin
  setlength(fbufferarry,10); //数组长度为10
  //这里省掉把数据加入记录数据的语句
  ///////////////
  getmem(p,sizeof(Posrecord)*10); //为指针分配内存
  p:=@fbufferarry;  for i:=0 to 9 do 
    begin
       recrecord:=p^;
       //这里省掉操作记录的语句
       inc(p);
    end;   freemem(p);
end;

解决方案 »

  1.   

    getmem(p,sizeof(Posrecord)*10); //为指针分配内存
    //  p:=@fbufferarry;
    // 上句改为
       p:=@fbufferarry[0];  //取得头一个记录的地址
      for i:=0 to 9 do 
        begin
           recrecord:=p^;
           //这里省掉操作记录的语句
           inc(p);
        end;   freemem(p);              ///释放内存的时候就 显示 无效的指针操作,不懂怎么回事, 上面的取数据操作已经成功了end;
      

  2.   

    我看了DELPHI自带的FREEMEM的帮助,里面讲到如果指针指向的是动态数组,需要在FREEMEM之前使用Finalize,但我试过了,也还是不行
      

  3.   

    getmem(p,sizeof(Posrecord)*10); //为指针分配内存
      p:=@fbufferarry;yun...你看看你的p指向哪裡取了。fbufferarry中存放的又不是指針是record對象而已 不同釋放。。
      

  4.   

    beyondtkl(DaLongJu</*Call me Fred*/>) ( ) 意思是不用释放了是吗?
      

  5.   

    beyondtkl(DaLongJu</*Call me Fred*/>) ( )要不要在开始那里使用getmem?
    如果要
     分配多大的内存给 P指针?是sizeof(posrecord)还是 sizeof(posrecord)*10;
     那最后使用 finalize(fbufferarry)吗?
      

  6.   

    GetMem(p, SizeOf(PosRecord) * 10); //这个时候p才确定一个地址p := @fbufferarry[0];
    inc(p);
    变量p在这两个地方改变了FreeMem(p, SizeOf(PosRecord) * 10); //如果p的地址已经改变了,释放当然就会有异常
             //分配多少就释放多少
    p := @fbufferarry[0]; //这样用不需要在开辟空间
      

  7.   

    谢谢,
    那我应该如何用?我是调用一个BC++做的动态库,如下 typedef BOOL __stdcall (GETDATA)(void* pCommand, void* pDataBuffer, int nSize);
          其中 pDatabuffer取得返回的数据,返回的数据都是结构类型,
    我转成DELPHI
         function getdata(P:pointer;Pbuffer:pointer;nSize:integer):boolean;但老是取不到第二条记录 还有一个问题struct POSRECORD
    {
        int nInfoID;               
        int nMoneyCent;             
    int nBalance;         
    int nTotalTimes;        
        int nOperatorNum;             
     int nYear,nMonth,nDay;     
        int nHour,nMinute,nSecond;  
    BOOL bNormal, bCancel;     
    BOOL bReload;         
    int nDMAdr;         
    };这个记录是占用 60个字节的空间的,转成DELPHI只占用52个字节,怎么办?你有Q吗?我加你详细请教一下,谢谢
      

  8.   

    zswang(伴水清清)(专家门诊清洁工)大师说的是,指向数组的指针可以不分配额外的空间
      

  9.   

    BC++中需要是吗?posrecord记录结构
      id:integer;
        money:integer;
    end;ncount=10
    POSRECORD *pRecordBuffer = new POSRECORD[nCount];
            POSRECORD *pBuffer = pRecordBuffer;
    POSRECORD CardRecord;
            gettData(P, pBuffer, nLength);
            for(int iLoop = 0; iLoop < nCount; iLoop ++)
                    {
             CardRecord = *(pBuffer ++);上述的代码如何转成DELPHI?
      

  10.   

    PPOSRECORD=^POSRECORD;
    var
        pRecordBuffer:array of char;        setlength(pRecordBuffer, nLength);  //动态分配内存        fgetdata(fdllcall.m_pActReturn, pRecordBuffer, nLength);
            for iLoop := 0 to nCount - 1 do
            begin
              CardRecord := PPOSRECORD(integer(pRecordBuffer)+iLoop*sizeof(POSRECORD))^;
      

  11.   

    老兄,你提过这个问题的,还没解决吗。怎么不见下文呢。试试我上面的代码,应该能给你解决问题。http://community.csdn.net/Expert/topic/3847/3847856.xml?temp=.9374811
      

  12.   

    gzmhero(hihihi) 是取得下面的数据,但数据格式不对了,是不是因为 BC与DELPHI的字节对齐问题,?001031,00060,005100,00043,000,2005-03-16,12:55:41,0,0,0,0,001
    000012,00700,008940,00034,000,2005-03-16,12:55:47,0,0,0,0,001
    上面是正确的
    001031,00060,005100,00043,000,2005-03-16,12:55:41,0,0,0,0,000
    000000,00001,000012,00700,8940,0034-00-2005,03:16:12,1,0,0,1,047
    相当于是第一条数据少了01,第二条数据把 第一条数据的01加了进来