【问题标题】:Variadic Functions in Visual FoxProVisual FoxPro 中的可变参数函数
【发布时间】:2014-11-18 20:10:52
【问题描述】:

如何在 Microsoft Visual Foxpro 中编写可变参数函数?

可变参数函数是一个接受可变数量参数的函数 - 请参阅http://en.m.wikipedia.org/wiki/Variadic_functionhttp://rosettacode.org/wiki/Variadic_function 提供了世界上几乎所有其他编程语言的示例,但不是好狐狸。

所以给定以下函数:

Function PrintVars(var1,var2,var3)
    ? var1
    ? var2
    ? var3
End Func

我们如何允许任意数量的参数?

【问题讨论】:

    标签: variadic-templates visual-foxpro variadic-macros variadic-functions


    【解决方案1】:

    我不同意这是一种有限的能力。你不必做任何特别的事情。默认情况下,VFP 允许您传递少于指定数量的参数。

    另外,不要使用 PARAMETERS() 函数来查看您收到了多少参数。它有一个缺陷;如果您在使用之前调用另一个例程,它会告诉您有多少参数传递给该例程。改用 PCOUNT() ;它总是告诉你有多少参数被传递给当前例程。

    这里有一些代码演示了 PARAMETERS() 有什么问题:

    DEBUG
    
    Subproc("abc", 123)
    
    RETURN
    
    PROCEDURE Subproc(cParm1, nParm2)
    
    DEBUGOUT "Immediately on entry to Subproc"
    DEBUGOUT "  PARAMETERS() returns ", PARAMETERS()
    DEBUGOUT "  PCOUNT() returns ", PCOUNT()
    
    Subsubproc()
    
    DEBUGOUT "After call to Subsubproc"
    DEBUGOUT "  PARAMETERS() returns ", PARAMETERS()
    DEBUGOUT "  PCOUNT() returns ", PCOUNT()
    
    RETURN
    
    PROCEDURE Subsubproc
    
    RETURN
    

    运行此代码后,查看“调试输出”窗口。

    【讨论】:

    • 是的。我不太会考虑 PCOUNT() 和 PARAMETERS() 之间的区别;我们在任何给定函数的开头进行所有与参数相关的内务处理,所以这无关紧要。该工具的限制(与大多数现代语言相比)是您必须在 PARAMETERS 语句中指定至少与您打算实际调用它的参数一样多的参数。
    • 你是说唯一的方法是使用最大参数数量的函数签名(根据msdn.microsoft.com/en-us/library/3kfd3hw9(v=vs.80).aspx传递参数的最大数量为26)并使用PCOUNT()检查通过了多少? PARAMETERS 与 PCOUNT 的完美结合。不敢相信我已经使用 VFP 开发近 20 年了,并且从未使用或遇到过 DEBUGOUT。我一直只是用?或过去的 STRTOFILE。
    • 另一种选择是传递一个对象,该对象包含每个参数的属性或数组属性。老实说,我从来不需要超过(或接近)26 个参数。如果这样做,您可能需要重新考虑设计。
    【解决方案2】:

    您在 VFP 中执行此操作的能力有限。

    FUNCTION printvars
    PARAMETERS p1, p2, p3, p4
        ? "Parameter count", PARAMETERS()
        ? p1
        ? p2
        ? p3
        ? p4
    RETURN
    

    这样称呼: printvars(1, 2)

    您的结果将是:

    Parameter count    2
             1
             2
    .F.
    .F.
    

    VFP 将初始化您未使用逻辑 .F 显式传递的任何参数。价值。 PARAMETERS() 函数显然会告诉您实际传递了多少。

    传递太多参数会给你一个错误,你的 PARAMETER 语句需要指定更多参数。

    【讨论】:

    • 根据我对 Tamar 的评论,我们是否得出结论,指定最大参数数量是在 VFP 中执行此操作的唯一方法?只是大声思考,我正在等待有人提出一个魔术,涉及宏替换、数组或指针或通过引用传递或 Windows API 调用或其他东西。
    • 是的,您需要在 PARAMETER 语句中指定参数的最大数量。如果您想传递包含实际参数的单个数组,那么天空就是极限!如果你真的不知道你可能需要通过多少东西,这可能是你最好的选择。
    • 除了简单的参数之外,您实际上也可以传入可能具有许多属性、数组、别名等的对象,但我认为目的是针对常见的相同数据类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多