Foxtable(狐表)用户栏目专家坐堂 → 内部函数的调用


  共有2463人关注过本帖树形打印复制链接

主题:内部函数的调用

帅哥哟,离线,有人找我吗?
夏许多雪
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:110 积分:1218 威望:0 精华:0 注册:2018/2/25 13:54:00
内部函数的调用  发帖心情 Post By:2019/4/24 19:41:00 [只看该作者]

下面是一个自行编制的内部函数 Lex,其中的第一个参数代表数据表中满足条件的行数减一,第二个参数为各行相同的一个数据,后面的参数从为表中满足条件的各行中提取四列的数据顺序填入。由于行数(即第一 个参数)是不确定的,也就是说,函数的参数量是不确定的,
如:Output.Show(Functions.Execute("Lex",0,6,4,85,86,89))   计算结果为 84.4
Output.Show(Functions.Execute("Lex",1,6,4,85,86,89,2,96,99,98.5))计算结果为93.2
Output.Show(Functions.Execute("Lex",2,6,4,85,86,89,2,96,99,98.5,4,95.6,98.8,97))计算结果为97.2
上面举例为1、2、3行的情况下计算方式,但在不确定行数情况下请问怎么调用这个函数?

Dim i As Integer = args(0)
Dim d As Single = args(1)
Dim Lex As Single
Dim t() As List(of Single)
Dim l() As List(of Single)
Dim ttotal As Single = 0
Dim Ltotal As Single = 0
For k As Integer = 0 To i
ttotal = ttotal + args( 2 + 4 * k)
Ltotal = Ltotal + args( 2 + 4 * k) * 10^(0.1 * (args( 3 + 4 * k) + args( 4+ 4 * k) + args( 5 + 4 * k)) / 3)
Next
Lex = 10 * Math.log10(d / 5 * 10^( 0.1 * (10 * Math.log10(Ltotal / ttotal) + 10 * Math.log10(ttotal / 8))))
Return Format(Lex,"#0.0")






[此贴子已经被作者于2019/4/24 19:43:33编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/4/24 21:01:00 [只看该作者]

用 (args.length - 2) \ 4 - 1 即可

 回到顶部
帅哥哟,离线,有人找我吗?
夏许多雪
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:110 积分:1218 威望:0 精华:0 注册:2018/2/25 13:54:00
  发帖心情 Post By:2019/4/24 21:45:00 [只看该作者]

我问的是args的长度不确定的情况下,如何引用自定义函数,如符合条件的行数为 i 行,哪么 参数应该有 4i+2个,其中第1个参数args(0)为i-1,第2个参数args(1)为d,后面还有4i个参数从args(2)至args(4i+1),引用函数时应按如下写:
Functions.Execute("Lex",i-1,d,args(2),args(3)...........args(4i+1))
但省略号部分无法写,只能一一列举 i 的值来写,请问有什么简单的方法来写吗,如  i-1,d,args(2),args(3)...........args(4i+1)  部分用字符串来表示是否可以等。

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/4/24 21:55:00 [只看该作者]

不理解你的意思。

 

如果是调用的问题,你可以直接传一个字符串进去,然后你根据逗号,分割出各个字符,然后计算。

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/4/24 21:55:00 [只看该作者]

或者是,你可以直接合成一个数组,传进去。

 回到顶部
帅哥哟,离线,有人找我吗?
夏许多雪
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:110 积分:1218 威望:0 精华:0 注册:2018/2/25 13:54:00
  发帖心情 Post By:2019/4/24 22:16:00 [只看该作者]

我的意思是如下引用max函数
Dim t() As Single= {1,2,3}
Output.Show(Functions.Execute("Max",t(0),t(1),t(2)))
上面数组是3个数是可以的,但是,如果数组的个数 i 如果不确定,或者很长,如何引用 Max函数。可不可以写成诸如:
Dim t() As Single= {1,2,3,.........,i}
Output.Show(Functions.Execute("Max",t))


 回到顶部
帅哥哟,离线,有人找我吗?
夏许多雪
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:110 积分:1218 威望:0 精华:0 注册:2018/2/25 13:54:00
  发帖心情 Post By:2019/4/24 22:23:00 [只看该作者]

为什么如下代码,计算出的是123,而不是3?这是不是版主说的传一个字符串进去?
Dim t As String = "1,2,3"
Output.Show(Functions.Execute("Max",t))
[此贴子已经被作者于2019/4/24 23:22:56编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/4/24 23:28:00 [只看该作者]

改成

 

Dim t As String = "1,2,3"
Output.Show(Functions.Execute("Max",t.split(",")))

 


 回到顶部
帅哥哟,离线,有人找我吗?
夏许多雪
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:110 积分:1218 威望:0 精华:0 注册:2018/2/25 13:54:00
  发帖心情 Post By:2019/4/25 10:16:00 [只看该作者]

自定义Max函数为:

Dim MaxVal As Single = Args(0)
For i As Integer = 1 To Args.Length - 1
    MaxVal = Math.Max(MaxVal,Args(i))
Next
Return MaxVal

按版主的编码,
Dim t As String = "1,2,3"
Output.Show(Functions.Execute("Max",t.split(",")))

运行后出现错误的详细信息如下,这是什么问题?

.NET Framework 版本:2.0.50727.8940
Foxtable 版本:2019.4.12.1
错误所在事件:自定义函数Max
详细错误信息:
调用的目标发生了异常。
重载决策失败,必须进行收缩转换才能调用 Public“Max”: 
    'Public Shared Function Max(val1 As ULong, val2 As ULong) As ULong':
        与参数“val1”匹配的参数从“Single”收缩到“ULong”。
        与参数“val2”匹配的参数从“String”收缩到“ULong”。
    'Public Shared Function Max(val1 As Long, val2 As Long) As Long':
        与参数“val1”匹配的参数从“Single”收缩到“Long”。
        与参数“val2”匹配的参数从“String”收缩到“Long”。
    'Public Shared Function Max(val1 As Single, val2 As Single) As Single':
        与参数“val2”匹配的参数从“String”收缩到“Single”。
    'Public Shared Function Max(val1 As Decimal, val2 As Decimal) As Decimal':
        与参数“val1”匹配的参数从“Single”收缩到“Decimal”。
        与参数“val2”匹配的参数从“String”收缩到“Decimal”。
    'Public Shared Function Max(val1 As Double, val2 As Double) As Double':
        与参数“val2”匹配的参数从“String”收缩到“Double”。
    'Public Shared Function Max(val1 As UInteger, val2 As UInteger) As UInteger':
        与参数“val1”匹配的参数从“Single”收缩到“UInteger”。
        与参数“val2”匹配的参数从“String”收缩到“UInteger”。
    'Public Shared Function Max(val1 As Byte, val2 As Byte) As Byte':
        与参数“val1”匹配的参数从“Single”收缩到“Byte”。
        与参数“val2”匹配的参数从“String”收缩到“Byte”。
    'Public Shared Function Max(val1 As SByte, val2 As SByte) As SByte':
        与参数“val1”匹配的参数从“Single”收缩到“SByte”。
        与参数“val2”匹配的参数从“String”收缩到“SByte”。
    'Public Shared Function Max(val1 As Short, val2 As Short) As Short':
        与参数“val1”匹配的参数从“Single”收缩到“Short”。
        与参数“val2”匹配的参数从“String”收缩到“Short”。
    'Public Shared Function Max(val1 As Integer, val2 As Integer) As Integer':
        与参数“val1”匹配的参数从“Single”收缩到“Integer”。
        与参数“val2”匹配的参数从“String”收缩到“Integer”。
    'Public Shared Function Max(val1 As UShort, val2 As UShort) As UShort':
        与参数“val1”匹配的参数从“Single”收缩到“UShort”。
        与参数“val2”匹配的参数从“String”收缩到“UShort”。



 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/4/25 13:32:00 [只看该作者]

改成

 

MaxVal = Math.Max(MaxVal, val(Args(i)))


 回到顶部