急!动态数组的一次性赋值!(100分)

E

esheen

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中定义了一个二维动态数组--onearray:array of array of integer,并setlength(onearray,longa,longb),现在我想从一个二进制文件中一次性读取一个数据块赋值给该数组(该二进制文件都是由integer类型的整数组成),请高手指点,我该如何做!
 
var
f: integer;
begin
f := fileopen('BinaryFile', fmOpenRead);
fileread(f, @(OneArray[0,0]), longa*longb*sizeof(Integer));
fileclose(f);
end;
 
eyes : 好象编译通不过呀?
 
???
哪出错?
 

>> fileread(f, @(OneArray[0,0]), longa*longb*sizeof(Integer));

error : Constant object cannot be passed as var parameter

另外fileread的第二个参数是变量参数.
function FileRead(Handle: Integer
var Buffer
Count: LongWord): Integer;
 
试试以下的程序:
var
file1:file;
A : array of array of integer;
I, J : Integer;
begin
SetLength(A, longa,longb);
if OpenDialog1.Execute then
begin
AssignFile(file1, OpenDialog1.Filename);
Reset(file1)
//打开数据文件
for I := Low(A) to High(A) do
for J := Low(A) to High(A) do
begin
Read(file1, A[I,J])
//把数据从数据文件读入
end;
CloseFile(file1);
end;
end;
 
seasky, 谁叫你定义OneArray是const的?
 
不会吧, 我可以这样定义的
var
f,longa,longb: integer;
OneArray : array of array of Integer
begin
f := fileopen('BinaryFile', fmOpenRead);
fileread(f, @(OneArray[0,0]), longa*longb*sizeof(Integer));
fileclose(f);
end;
 
你试一下就知道了.
 
fileread(f, OneArray, longa*longb*sizeof(Integer));
 
hehe , 这就对了.
 
var
x:tmemorystream;
begin
x:=tmemorysteam.create;
x.loadfromfile('binfile');
@(onearray[0,0]):=@x;
end;

行不行?
 
cytown, 似乎不行, delphi编译器还没聪明到这地步. 再说数据结构也不对. memorystream具体存放memory的只是一个指针, 指向另一块内存区.
 
eyes, 你是对的. 不过如果是C应当可以, DELPHI对数据结构的要求
实在是很死 :-(
 
c可以是因为它重载了"="操作的缘故
 
geshengping: 您的办法对付小文件还可以,如果文件有几兆的话,时间太长,对硬盘的磨损也厉害,这是一种效率最低的办法,不是‘一次性赋值’。
cytown:您的办法也不行,因为我并不需要整个文件,我只需要文件中间的一块。
Another_eYes:您的办法也行不通,不信试试如下代码:

var
tm,f,longa,longb,i: integer;
onearray:array of array of integer;
begin
longa:=10;
longb:=100;
f:=filecreate('c:/test');
for i:=1 to 2000 do
begin
filewrite(f,i,sizeof(i));
end;
fileclose(f);
setlength(onearray,longa,longb);
f := fileopen('c:/test', fmOpenRead);
tm:=fileread(f, OneArray, longa*longb*sizeof(Integer));//注意:tm=-1! fileclose(f);
//caption:=inttostr(tm);
//caption:=inttostr(onearray[0,0]);
end;
 
这个可以

var
tm,f,longa,longb,i: integer;
onearray:array of integer;
begin
longa:=10;
longb:=100;
f:=filecreate('c:/test');
for i:=1 to 2000 do
begin
filewrite(f,i,sizeof(i));
end;
fileclose(f);
setlength(onearray,longa*longb);
f := fileopen('c:/test', fmOpenRead);
tm:=fileread(f, OneArray[0], longa*longb*sizeof(integer));
fileclose(f);
caption:=inttostr(tm);
caption:=inttostr(onearray[0]);
end;

以后调用onearray[x,y]时使用onearray[x*longa+y]就可以了.

 
接受答案了.
 

Similar threads

顶部