最近写一个数据处理的程序,从一个数据文件里读去数据,我定义一个记录,里面包含两个一维动态数组,数组的维数是随时变化的。可是在读数据是总是出错。程序如下:
var
  Form1: TForm1;
  type
        TDataFile= packed record
        ...
        ParNum:word;
        SignalNum:word;
        ...
  end;
  type
     data = packed  record
        Parvalue:=array of single;
        V:=array of integer;
  end;
     var
        DataIn:file;
        a:TDataFile;
        dd:data;
        f:Ansistring;
procedure TForm1.OpenClick(Sender: TObject);begin
     OpenDialog.Title:='打开数据文件';
     if OpenDialog.Execute then
     begin
        ...
        f:=OpenDialog.FileName;
        AssignFile(datain, OpenDialog.FileName);
        Reset(datain,1);
        BlockRead(datain, a, SizeOf(a), NumRead); 
        ...
        CloseFile(datain);
     end;
   ...
   LoadData(GridData,SBar,Sender);
end;procedure   LoadData(GData:TStringGrid;SBar:TStatusBar;Sender:TObject);
var
  i,k:integer;
begin
   SetLength(dd.ParValue,a.ParNum);
   SetLength(dd.v,a.SignalNum);
   ...
   AssignFile(datain, f);
   Reset(datain, 1);
   seek(datain,sizeof(a)); 
   ...
    BlockRead(datain,dd,sizeof(dd),NumRead);
   ...
   GData.Cells[i+1,row]:=Format('%8.3f',[dd.ParValue[k]]);
   ...
   CloseFile(datain);     
end;当把记录的两个数组设置为固定的维数时,用上述方法读取数据正确,但用变量定义数组的大小时,读取数据就出现错误。如下:
...
type
    data = record
     Parvalue:=array[0..200] of single;
     V:=array[0..12] of integer;
end;
dd:data;
...
当然,我用如下过程也可以实现要求,只是程序运行太慢,受不了...
    for j:=0 to a.ParNum-1 do
        begin
            BlockRead(datain,dd.ParValue[j],sizeof(dd.ParValue),NumRead);
        end;     for j:=0 to a.SignalNum-1 do
        begin
            BlockRead(datain,dd.V[j],sizeof(dd.V),NumRead);
        end; 
   ...
   GData.Cells[i+1,row]:=Format('%8.3f',[dd.ParValue[k]]);
   ...
   CloseFile(datain);     
end;可是是我需要的是变化的,为什末总是出错哪,帮帮我,绝对送分

解决方案 »

  1.   

    是不是报告内存错误?
      你试一试 a.parnum +1 ;
                                 a.SignalNum +1 ;
    我猜测是内存分配空间不足!
       SetLength(dd.ParValue,a.ParNum + 1);
       SetLength(dd.v,a.SignalNum + 1);
       
      

  2.   

    看太累。
    先定义
     pTa:^TA;
     TA:Array [0...MaxInt] of Integer;type
         data = packed  record
            Parvalue:=pTA;
            V:=pTA;
      end;在程序里用GetMem或ReallocMem定义数组对应内存大小
      

  3.   

    to youhongwei78(飞天木马) 
    为什么要
           a.parnum +1 ;
           a.SignalNum +1 ;
    我有点不懂。麻烦指教。
      

  4.   

    用断点先看一下你的a.parnum,a.singalnum这两个变量在定义数组长度中的值!
      

  5.   

    你定义为动态数组后不要一次性定长,它的用法最好是在数组中插入一个后,用一次SetLength。长度加1
      

  6.   

    to: handsome1127(硕硕龙) 你说的意思我没明白,麻烦说清楚点