如何用数组作为函数的可选参数?(50分)

  • 主题发起人 主题发起人 liangexcel
  • 开始时间 开始时间
L

liangexcel

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TMySet = set of 1..100;
TArraySet = array of TMySet;
我想用TArraySet作为可选参数传入函数内.如何办到?
看看我原来的代码
function GetIntersection(APrevious: TArraySet; ANext: TArraySet):TArraySet;
var
i: integer;
begin
setlength(result,High(APrevious)+1);
for i := low(APrevious) to High(APrevious) do
result := APrevious*ANext;
end;
看到没有,我的作用是用来交集后得出最后的集合数组.但是我这个函数一次只能用两个,实际中的数组个数是不定的,但每个数组的上限是一样的.
我想实现的是
function GetIntersection(APrevious: TArraySet; ANext1: TArraySet; ANext2: TArraySet; ANext3: TArraySet; ANext4: TArraySet; ANext5: TArraySet; ANext6: TArraySet; ANext7: TArraySet; ANext8: TArraySet; ANext9: TArraySet; ANext10: TArraySet):TArraySet;
只有APrevious参数是固定的,其他ANext是可选的.
 
直接定义就是了,比如
function test(tarrayset:array of tmyset):boolean;
begin
setlength(tarrayset,xxx);//xxx为你想把这个数组定义的长度
dosomething;
result := true;
end;
 
to cqwty:可能你没有理解我的题目吧.如果是你那样,我直接用function test(tarrayset:TAarray):boolean;就行了.我希望传入的是可选参数,既然是可选参数,那么有会有N个参数了,而且有默认值的吧?你也看到,那个数组是集合数组来的,我是用来进行多个集合数组交集用的.但是我不能知道客户到底会输入多少个集合数组,所以希望能够让参数变成可选的.,但是最少必然有一个参数不是可选的.
 
那你可以完全重载啊,先写一个参数都没有的,然后再重载一个来写带数组做为参数的,这样不行嘛?函数调用的时候会根据参数来确定调用的是哪个函数了.
 
look~
TMySet = set of 1..100;
TArraySet = array of TMySet;
PArraySet = ^TArraySet;
...
procedure test(p:PArraySet;count:integer);
var
i:integer;
begin
for i := 0 to Count - 1 do
if p^ = [1,2,3] then
showmessage(inttostr(i));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ss:TArraySet;
begin
setlength(ss,4);
ss[0] := [1,3,4];
ss[1] := [33,4];
ss[2] := [1,2,3];
ss[3] := [9];
test(@ss,4);
end;
 
参数用 array ,不知道delphi 是否可以用一个指针来表示 数组的地址 ,
 
to cqwty:重载是可以,但是需要处理的数组,少时可能只有一个,多时可能有十几个(是多个数组,不是一个数组的上限),我不可能写十几个函数吧?
to merkey2002:不合要求,你看看我的原来的代码吧.
function GetIntersection(APrevious: TArraySet; ANext: TArraySet):TArraySet;
var
i: integer;
begin
setlength(result,High(APrevious)+1);
for i := low(APrevious) to High(APrevious) do
result := APrevious*ANext;
end;
看到没有,我的作用是用来交集后得出最后的集合数组.但是我这个过程一次只能用两个,实现中的数组个数是不定的,但每个数组的上限是一样的.
 
用链表吧,链表结构可以实现你的需求.
 
用2维动态数组
 
看看这些,合并两个动态数组
来自:vvyang, 时间:2005-8-30 10:50:23, ID:3185155
type
TArrayOfInteger = array of Integer;

function CombineArray(a, b: TArrayOfInteger): TArrayOfInteger;
var
i, l: Integer;
begin
l := Length(a);
SetLength(Result, l + Length(b));
for i := Low(a) to High(a) do Result := a;
for i := Low(b) to High(b) do Result[i + l] := b;
end;
来自:xianguo, 时间:2005-8-30 10:07:16, ID:3185095
MyCopyArray(A1, A2 : array of string; out A3 : array of string);
begin
CopyMemory(@A3[Low(A3)], @A1, (High(A1)-Low(A1)+1)*SizeOf(string));
CopyMemory(@A3[Low(A3) + (High(A1)-Low(A1)+1)], @A2,
(High(A2)-Low(A2)+1)*SizeOf(string));
end;
 
我觉得是楼主的想法有问题,不要采用多个参数,一个就够了:
type
tArrayList = array of tArraySet;
var
ary : tArraySet;
arylst :tArrayList;


function f(lst:tArrayList):integer;
var aryset :tArraySet;
begin
for i:= low(lst) to high(lst) do
begin
aryset = lst
.....
end;
end;
 
to lxggc:你的意思是让我做成三维数组,然后再传入?
 
function GetIntersection(APrevious: TArraySet; ANext1: TArraySet=nil;
ANext2: TArraySet=nil; ANext3: TArraySet=nil; ANext4: TArraySet=nil;
ANext5: TArraySet=nil; ANext6: TArraySet=nil; ANext7: TArraySet=nil;
ANext8: TArraySet=nil; ANext9: TArraySet=nil; ANext10: TArraySet=nil;
ANext11: TArraySet=nil; ANext12: TArraySet=nil; ANext13: TArraySet=nil;
ANext14: TArraySet=nil; ANext15: TArraySet=nil; ANext16: TArraySet=nil):TArraySet;
var
i: integer;
ANext: TArraySet;
begin
setlength(result,High(APrevious)+1);
if ANext1 = nil then ANext1 := APrevious;
if ANext2 = nil then ANext2 := APrevious;
if ANext3 = nil then ANext3 := APrevious;
if ANext4 = nil then ANext4 := APrevious;
if ANext5 = nil then ANext5 := APrevious;
if ANext6 = nil then ANext6 := APrevious;
if ANext7 = nil then ANext7 := APrevious;
if ANext8 = nil then ANext8 := APrevious;
if ANext9 = nil then ANext9 := APrevious;
if ANext10 = nil then ANext10 := APrevious;
if ANext11 = nil then ANext11 := APrevious;
if ANext12 = nil then ANext12 := APrevious;
if ANext13 = nil then ANext13 := APrevious;
if ANext14 = nil then ANext14 := APrevious;
if ANext15 = nil then ANext15 := APrevious;
if ANext16 = nil then ANext16 := APrevious;
try
for i := low(APrevious) to High(APrevious) do
result := APrevious*ANext1*ANext2*ANext3*ANext4*
ANext5*ANext6*ANext7*ANext8*ANext9*ANext10*
ANext11*ANext12*ANext13*ANext14*ANext15*ANext16;
except
ShowMessage('参数传递有误');
end;
end;
 
楼主再定义一个TArraySet的数组不就行了吗?
type
TMySet = set of 1..100;
TArraySet = array of TMySet;
TArArraySet = array of TArraySet;//定义这个,然后过程的参数传入这个参数就行

function GetIntersection(APrevious: TArArraySet):TArraySet;
 
to hongxing_dl:你的方法和lxggc的一样,都需要我调用参数前再进行一次数组组合,我本来就是想省了那部分的工作,让代码更清晰简洁一点.
 
来自:zqw0117, 时间:2006-11-3 8:28:01, ID:3613598 | 编辑
用链表吧,链表结构可以实现你的需求.
 
终极答案:
type
tary = array of string;

procedure dowork(a:array of tary);
begin
//....
end;

procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,d,e:tary;
begin
dowork([a,b,c,d,e]);
end;
 
为什么不定义一个
TArSet2 = array of TArraySet
function GetIntersection(AList: TArSet2):TArraySet;
一个参数就可以了
 
大家似乎都看不明白,我要做的是可选参数
 
做成N参数加可选,没法用循环,反为不美
 
后退
顶部