要先拿分,高手就请进来!!!

ma369 2003-06-24 12:49:54
最近写一个数据处理的程序,从一个数据文件里读去数据,我定义一个记录,里面包含两个一维动态数组,数组的维数是随时变化的。可是在读数据是总是出错。程序如下:
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;

可是是我需要的是变化的,为什末总是出错哪,帮帮我,绝对送分。。。
...全文
32 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ma369 2003-06-26
  • 打赏
  • 举报
回复
麻烦楼上的能否讲的详细点,小弟太愚,没看明白。
hansion3406 2003-06-26
  • 打赏
  • 举报
回复
seltlength(sizeof(你的实例))
ma369 2003-06-26
  • 打赏
  • 举报
回复
to: handsome1127(硕硕龙) 你说的意思我没明白,麻烦说清楚点。。。
handsome1127 2003-06-26
  • 打赏
  • 举报
回复
你定义为动态数组后不要一次性定长,它的用法最好是在数组中插入一个后,用一次SetLength。长度加1
ma369 2003-06-26
  • 打赏
  • 举报
回复
没有别人,自己up一下
ma369 2003-06-26
  • 打赏
  • 举报
回复
没有别人,自己up一下
ma369 2003-06-26
  • 打赏
  • 举报
回复
没有别人,自己up一下
ma369 2003-06-25
  • 打赏
  • 举报
回复
to youhongwei78(飞天木马)
为什么要
a.parnum +1 ;
a.SignalNum +1 ;
我有点不懂。麻烦指教。
keyz 2003-06-25
  • 打赏
  • 举报
回复
查一下sizeof(dd)的值是多少。
windwather 2003-06-25
  • 打赏
  • 举报
回复
用断点先看一下你的a.parnum,a.singalnum这两个变量在定义数组长度中的值!
knock 2003-06-24
  • 打赏
  • 举报
回复
C++里面的动态数组是可以用。这里就不知道了
youhongwei78 2003-06-24
  • 打赏
  • 举报
回复
是不是报告内存错误?
你试一试 a.parnum +1 ;
a.SignalNum +1 ;
我猜测是内存分配空间不足!
SetLength(dd.ParValue,a.ParNum + 1);
SetLength(dd.v,a.SignalNum + 1);

nba23 2003-06-24
  • 打赏
  • 举报
回复
我也看不懂
407107 2003-06-24
  • 打赏
  • 举报
回复
看太累。
先定义
pTa:^TA;
TA:Array [0...MaxInt] of Integer;

type
data = packed record
Parvalue:=pTA;
V:=pTA;
end;

在程序里用GetMem或ReallocMem定义数组对应内存大小

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧