关于一个动态二维数组的疑惑? (10分)

  • 主题发起人 主题发起人 jbas
  • 开始时间 开始时间
J

jbas

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
kk:array of array of integer;
i,j:integer;
begin
i:=2;
j:=3;
setlength(kk,i,j);//定义一个1*2的二维数组.
kk[i,j]:=2
//编译出错.
kk[i-1,j]:=2;//编译通过.
kk[i-1,j+1]:=2
//编译通过.why???kk[0,3]怎么不出错,而kk[1,2]出错???难道kk的边界不是kk[0..1,0..2]??
end;
 
这么多高手在线上,帮帮忙呀.对你们来说不难吧!
 
指针-〉指针-〉连续的数据单元
如果第一个指针错了,后面就全错了
如果第二个指针错了,那么可能出错,也可能不出错,但是数据会写在不是自己的范围内的地方
 
补充,第一个下标就是上面我说的第一个指针
 
to Pipi.大虾:
>>但是数据会写在不是自己的范围内的地方
请看看下面的代码,为什么那些存储都是正确的.label上显示的是存进去的数呀.您上面的话
什么意思呀?
还有一个问题,那个SetLength(var S
NewLength: Integer);其中定义的NewLength为integer
类型,最大只能分配2147483647个数组空间大小.如果我想分配更大的空间大小,那怎么办呢?
例如有这样的函数吗?SetLength(var S
NewLength: extended);??数组最大能定义多大呀?
procedure TForm1.Button2Click(Sender: TObject);
var
kk:array of array of integer;
i,j,k,m,n:integer;
begin
i:=2;
j:=3;
setlength(kk,i,j);//定义一个1*2的二维数组.
kk[i-1,j+1]:=2
//编译通过.why???kk[0,3]怎么不出错,而kk[1,2]出错???难道kk的边界不是kk[0..1,0..2]??
kk[i-1,j+2]:=3;
kk[i-1,j+100]:=4;
label1.Caption:=inttostr(kk[i-1,j+1]);
label2.Caption:=inttostr(kk[i-1,j+2]);
label3.Caption:=inttostr(kk[i-1,j+100]);
end;
谢谢了!
 
先从简单的讲起。
integer最大是2G,即使你的数组是字节数组,你的程序要用到2G内存吗,
我只是见到数据库服务器、domino服务器之类用到了那么大的内存
在nt下,一个用户进程本身光数据就用到2G,这是很困难的
而且delphi也不适合于写数据库之类的服务器
而且你还可以通过指针等访问一大块内存
 
kk[i-1,j+100] 他把值保存在 kk[i-1,0]之后的第 4*102 字节处,已经超出了kk的范围
没出错,表示这个内存地址还是合法的,可以存取,不出错
但是目前这个地址的内存,是你的进程维护的、未申请出去的,还是已经申请出去、给别的对象用着的
谁也不知道,你往那里写、马上从那里读,当然读回了你写入的数
但是,可能在某个时候被别的对象写入这个地址,你的值就没了
更严重的是,你可能写坏了别的对象的内容,有可能在不确定的时候出现出错误
很多人会犯这个错误,当这种错误出现的时候,你很难查出是什么地方造成的
只能对老板说……delphi的bug
 
谢谢Pipi.大虾诲人不倦!
小弟是要存储一大堆的数.
想要定义a[1..power(4,50)]这样的数组.而那个a还是要动态变动的.即用setlength来改变.
a[1..4],a[1..4^2],a[1..4^3]....这样一直到a[1..power(4,50)](好像不能这样写,一定要
通过floattostr,strtoint来变换吗?但那样会丢掉extended部分的数值的呀?
您是说用delphi不能用一个数组来存储这么多的数吗?
小弟愚昧,请再指教一下.谢谢!

 
你自己的机器内存有多大啊,你的什么程序怎么可能需要用到2G的内存呢
你可以试试看你能不能申请到吧
理论上,一个普通的win32进程,有4G的逻辑内存空间,(nt企业版可以通过其他方式达到超过4G的空间)
但是用户级是使用低的2G的空间,高的2G被操作系统核心使用
别说2G了,你先试试看能不能申请到1G或者1.5G吧
如果你要处理大两的数据,不要把全部数据一次装入内存嘛,可以分段装入、处理、保存、再装入下一部分……
 
选中project---->options---->compiler Page--->Runntime errors--->Range checking,
你看看你的程序哪一句可以编译通过?

〉〉而kk[1,2]出错???
这一句是绝对不可能出错的。
 
procedure TForm1.Button1Click(Sender: TObject);
var
kk:array of array of integer;
i,j:integer;
begin
i:=2;
j:=3;
setlength(kk,i,j);//定义一个1*2的二维数组.
kk[i,j]:=2
//编译出错.
kk[i-1,j]:=2;//编译通过.
kk[i-1,j+1]:=2
//编译通过.why???kk[0,3]怎么不出错,而kk[1,2]出错???难道kk的边界不是kk[0..1,0..2]??
end;

我也没看懂,这上面哪里有kk[1,2]的语句??
 
to Pipi.:
谢谢大侠一直关注.
这次我仔细分析了一下我的程序,我本来是要把屏幕上的点的全部坐标存起来,以为会很大,
所以产生了要power(4,50)的念头(是用来分裂点的),但现在想想它只要1024*768=786432个点(对吗?).
所以,也用不着power(4,50);最多是power(4,10),
所以用那个SetLength(var S
NewLength: Integer);其中定义的NewLength为integer
类型,最大分配2147483647个数组空间大小,早就够用了.那些烦恼都没有了.
>>如果你要处理大两的数据,不要把全部数据一次装入内存嘛,可以分段装入、处理、保存、再装入下一部分……
谢谢提醒,我下次知道了.
再次感谢Pipi.大侠的教诲.

to savenight,
>>而kk[1,2]出错???
>>这一句是绝对不可能出错的。
是我说错了,不是编译时出错,是执行时出错.
to blankblock@263.net:
>>这上面哪里有kk[1,2]的语句??
sorry,也是我错了,是kk[2,3],没改过来.
谢谢大家!
 
多人接受答案了。
 
那么辛苦,才得到8分
 
Pipi.,
知足吧,你的分比我的分都快成了美元兑换人民币了,况且我的那道题还有至少有你50¥呢。
 
Pipi.大侠你都有89893分了,小弟只有3分了.要是我有89893分,我就全部给你了.:)
 
后退
顶部