2006. október 27., péntek
Create functions that can accept variable number of parameters such as Format()
Problem/Question/Abstract:
How to create functions that can accept variable number of parameters such as Format()
Answer:
Sometimes it's necessary to pass undefined number of [different type] variables to a function -- look at Format() function in Delphi and *printf() functions in C/C++ for example. Once you analyze the following code, you'll be on your way to creating mysterious variable parameter functions...
// FunctionWithVarArgs()
//
// skeleton for a function that
// can accept vairable number of
// multi-type variables
//
// here are some examples on how
// to call this function:
//
// FunctionWithVarArgs(
// [ 1, True, 3, '5', '0' ] );
//
// FunctionWithVarArgs(
// [ 'one', 5 ] );
//
// FunctionWithVarArgs( [] );
//
procedure FunctionWithVarArgs(
const ArgsList: array of const);
var
ArgsListTyped:
array[0..$FFF0 div SizeOf(TVarRec)]
of TVarRec absolute ArgsList;
n: integer;
begin
for n := Low(ArgsList) to
High(ArgsList) do
begin
with ArgsListTyped[n] do
begin
case VType of
vtInteger:
begin
{handle VInteger here}
end;
vtBoolean:
begin
{handle VBoolean here}
end;
vtChar:
begin
{handle VChar here}
end;
vtExtended:
begin
{handle VExtended here}
end;
vtString:
begin
{handle VString here}
end;
vtPointer:
begin
{handle VPointer here}
end;
vtPChar:
begin
{handle VPChar here}
end;
vtObject:
begin
{handle VObject here}
end;
vtClass:
begin
{handle VClass here}
end;
vtWideChar:
begin
{handle VWideChar here}
end;
vtPWideChar:
begin
{handle VPWideChar here}
end;
vtAnsiString:
begin
{handle VAnsiString here}
end;
vtCurrency:
begin
{handle VCurrency here}
end;
vtVariant:
begin
{handle VVariant here}
end;
else
begin
{handle unknown type here}
end;
end;
end;
end;
end;
//
// example function created using
// the above skeleton
//
// AddNumbers() will return the
// sum of all the integers passed
// to it
//
// AddNumbers( [1, 2, 3] )
// will return 6
//
//
function AddNumbers(
const ArgsList: array of const)
: integer;
var
ArgsListTyped:
array[0..$FFF0 div SizeOf(TVarRec)]
of TVarRec absolute ArgsList;
n: integer;
begin
Result := 0;
for n := Low(ArgsList) to
High(ArgsList) do
begin
with ArgsListTyped[n] do
begin
case VType of
vtInteger: Result := Result + VInteger;
end;
end;
end;
end;
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése