关于静态数组的参数调用!!(100分)

  • 主题发起人 For_Loop
  • 开始时间
F

For_Loop

Unregistered / Unconfirmed
GUEST, unregistred user!
我静态定义了一些二维数组 类似与 a: array [1..4,1..n] of string;
其中n为变数。我想在一个过程中根据引用这些静态数组的值,想用数组为调用参数。
procedure Disop(s:array of string
len:integer)
s定义为数组,len为n值。
想问一下,有什么好方法没有。
其中,
1、s这个参数怎么定义,才能完成调用。
2、如果不用动态数组有调用的方法没有??
3、如果不要参数len,怎么写才能实现第二维的长度?
eg:
CONST
XYJY1: array[1..4,1..1] of string
= (('PX'),
('4'),
('3'),
(''));
XYJY2: array[1..4,1..1] of string
= (('PM'),
('4'),
('3'),
(''));
ZFXX: array[1..4,1..2] of string
= (('ES','ED'),
('3','4'),
('0','0'),
('',''))
BYXX: array[1..4,1..3] of string
= (('PT','PR','WS'),
('103','4','5'),
('0','0','0'),
('','',''));
SWLL: array[1..4,1..10] of string
= (('Z','Q','AC','VA','VM','HS','ZS','QS','AS','VS'),
('3','4','5','6','7','8','109','110','111','112'),
('0','0','0','0','0','0','0','0','0','0'),
('','','','','','','','','',''));


procedure Disop(s:array of string
len:integer)

var
i,j:integer;
begin
for i;=1 to 4 do
for j:=1 to len do
//处理.....
memo1.line.add(s[i,j]);


end;




 
定義一個靜態一維數組a:=array[1..4]of string;
再定義一個動態數組b:= array of a;
使用Setlength(b,n)設置b的長度
 
那样太麻烦,而且上列静态数组我都已经定义过啦,不想再改写,
 
如果你非要这么做的话可以用指针吧,pchar就行了,不过我不熟:)

传递这些静态数组的地址就可以了
 
用VarArrayHighBound,VarArrayLowBound来遍历
 
大家再看看,只要实现以上的过程就给分
 
发现定维数组和动态数组处理的方式很不同嘛,变通一下,转换成一维动态数组处理:

procedure Disop(s:pointer ;len_x,len_y:integer);
var
tmparray: array of string;
i,j:integer;
begin
tmparray:=s;
setlength(tmparray,len_x[red]*[/red]len_y);//刚才这里写错了
for i := 0 to len_x-1 do
begin
for j := 0 to len_y-1 do
begin
//处理.....
memo1.line.add(tmparray[i*len_y+j]);
end;
end;
end;

调用:
Disop(@XYJY1,4,1);
Disop(@XYJY2,4,1);
Disop(@ZFXX,4,2);
Disop(@SWLL,4,10);
 
刚才有处写错
setlength(tmparray,len_x*len_y);
应该是len_x*len_y写成了len_x,len_y
 
谢谢楼上的,可惜上面的方法对一维数组是正确的,对多维数组就不对啦。
继续!!
 
哪里不对?你要的多维是几维啊?三维?四维?反正二维是可的,我是用你定义的二维数组和Disop的框架做例子的,难道运行出错?
 
当然出错啦,不信,你用上面的试 一下,Disop(@ZFXX,4,2);这个出错,前面两个调用的由于是一维的没有出错!!!
 
来自:For_Loop, 时间:2004-5-14 14:01:32, ID:2610098
当然出错啦,不信,你用上面的试 一下,Disop(@ZFXX,4,2);这个出错,前面两个调用的由于是一维的没有出错!!!

---------------------------

呵呵,仅从代码看,我给出的代码是没有错的,如果有错,请指出出错的代码行,相信你循环中的代码,会比较复杂,请再检查一下你自己的代码,下面的代码就是我做试验的代码,运行结果也在后面,请验收。

procedure TFrm_SelCol.Button2Click(Sender: TObject);
procedure Disop(s:pointer ;len_x,len_y:integer);
var
tmparray: array of string;
i,j:integer;
d:string;
begin
d:='';
tmparray:=s;
setlength(tmparray,len_x*len_y);
for i := 0 to len_x-1 do
begin
for j := 0 to len_y-1 do
begin
d:=d+tmparray[i*len_y+j]+';';
end;
d:=d+#10;
end;
Application.MessageBox(pchar(d),'消息',MB_OK+MB_ICONINFORMATION);
end;
const
SWLL: array[1..4,1..10] of string
= (('Z','Q','AC','VA','VM','HS','ZS','QS','AS','VS'),
('3','4','5','6','7','8','109','110','111','112'),
('0','0','0','0','0','0','0','0','0','0'),
('','','','','','','','','',''));
begin
Disop(@swll,4,10);
end;

运行结果:

---------------------------
消息
---------------------------
Z;Q;AC;VA;VM;HS;ZS;QS;AS;VS;
3;4;5;6;7;8;109;110;111;112;
0;0;0;0;0;0;0;0;0;0;
;;;;;;;;;;

---------------------------
确定
---------------------------
 
呵呵,那我先看一下
 
楼主等一等……

代码可能会有点问题,可能是定维数组和动态数组在存储上不同造成的,tmparray:=s;之后查看一下tmparray的值,奇怪吧?tmparray似乎是没有得到正确的长度,虽然setlength(tmparray,len_x*len_y);之后,也能得到一个一维数组,但怀疑这样做不安全,可能会造成内存错误,毕竟tmparray和swll是指向同一个地址的。

哪位高手路过帮忙解释一下定维数组和动态数组的问题吧。
 
呵呵,我把的你上面源程序拷贝试验了一下,结果出来的不对,并且退出的时候出现,非法访问的错误!!
我没有进行其他任何的处理,另外,我的版本是delphi5.0,不知道有关系,你可以在5下试一下。runtime error 216 at 0000506c!
 
我也是d5,单独运行Disop(@swll,4,10);是正确的,你跟踪一下,错误是否出现在setlength(tmparray,len_x*len_y);这句?应该是的,我也搞不定,等高手啦……[8D]
 
我的运行的结果是
消息
-------------------
;;;;;;;;;;
;;;;;;;;;;
;;;;;;;;;;
;;;;;;;;;;
我不知道是为什么??
 
>>并且退出的时候出现,非法访问的错误!!

大概就是我说的:“虽然setlength(tmparray,len_x*len_y);之后,也能得到一个一维数组,但怀疑这样做不安全,可能会造成内存错误”造成的。
 
俺试了一下没有错的

我的是D7

tmparray:=s;
setlength(tmparray,len_x*len_y);
换个顺序试试呢?
 
呼唤高手
 

Similar threads

S
回复
0
查看
949
SUNSTONE的Delphi笔记
S
S
回复
0
查看
770
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部