如何知道函数在使用的过程中参数的数量?(50分)

  • 主题发起人 主题发起人 kingswaysoft
  • 开始时间 开始时间
K

kingswaysoft

Unregistered / Unconfirmed
GUEST, unregistred user!
如何知道函数在使用的过程中参数的数量?
 
ShowMessage( 这时按下 Shift+Ctrl+空格
 
怎样知道一个函数在调用的过程中实参的数量?
还要返回实参的数量的值!
 
我也想知道
 
问题是这样的:

我定义了一个涵数:
function ABC(P1:string='A1';P2:string='A2';P3:string='A3';P4:string='A4'):string
begin
result:=P1+P2+P3+P4;
end

有时候传一个参数调用:
var
str:string;
str:=ABC(P1)
有时候传两个参数调用:
var
str:string;
str:=ABC(P1,P2)
有时候传三个参数调用:
var
str:string;
str:=ABC(P1,P2,P3)

我想知道在每次调用的时候实际传递了多少个参数?
 
有多少参数就传多少个了,不管你是否默认.
重载就不了样了.传多少个算多少个
 
应该说每次都传了四个参数,按照你的函数来看的话
 
问题是看明白了。
用楼主的函数定义的方法,要获得实参的数量确实很难实现,可能根本就无法实现。
建议楼主使用变通的方法,这样来定义函数:
function ABC(P1: TStrings):string;
这样应该可以解决楼主的问题,只是这样传参数的方法不直观,参数默认值也要在函数里面处理。
 
在不知道参数个数的情况下,调用对象的方法.

function ExecuteRoutine(AObj: TObject
AName: string

Params: array of const): DWord

const
RecSize = SizeOf(TVarRec)
// 循环处理参数列表时递增的字节数
var
PFunc: Pointer

ParCount: DWord

begin
if not Assigned(AObj) then
raise Exception.Create ('你确定传进来的是一个对象?')

PFunc := AObj.MethodAddress(AName)
// 获取方法地址
if not Assigned(PFunc) then
raise Exception.CreateFmt('找不到 %s 的 Method: %s', [AObj.ClassName,
AName])


ParCount := High(Params) + 1
// 获取参数个数

asm
PUSH ESI // 保存 ESI,我们待会儿要用到它

MOV ESI, Params // ESI 指向参数表首址
CMP ParCount, 1 // 判断参数个数
JB @NoParam
JE @OneParam
CMP ParCount, 2
JE @TwoParams

@ManyParams: // 超过两个参数
CLD // 清空方向标志
MOV ECX, ParCount
SUB ECX, 2 // 循环 ParCount - 2 次
MOV EDX, RecSize // EDX 依次指向每个参数的首址,每次递增 8 Bytes
ADD EDX, RecSize // 跳过前两个参数
@ParamLoop:
MOV EAX, [ESI][EDX] // 用基址变址寻址方式取得一个参数
PUSH EAX // 参数进栈
ADD EDX, RecSize // EDX 指向下一个参数首址
LOOP @ParamLoop

@TwoParams: // 两个参数
MOV ECX, [ESI] + RecSize

@OneParam: // 一个参数
MOV EDX, [ESI]

@NoParam:
MOV EAX, AObj // 传入实例地址(即,隐藏参数 Self)
CALL PFunc // 调用方法
MOV Result, EAX // 返回值放入 Result

POP ESI // 记得还原
end

end

被调用的方法
procedure TForm1.avg(a,b : Currency;var c : Currency)

begin
c := (a + b)/2

end

调用:
begin
var j : Currency

ExecuteRoutine(Form1,'avg',[12.21,12.32,@j])

end

------
这个可能对你有帮助。
 
这个可能需要用汇编,或者考虑一下变量的地址...
 
我对汇编一点都熟!
我要是用了,对出了问题我没法把握!
能不能提供或指点些。。。。。。
谢谢 babibean,也谢谢大家了!
 
babibean的代码不错。但是对lz的问题没有帮助。
除非该函数是类的方法,否则几乎是没有办法的。
 
后退
顶部