中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 怎样提高自定义VBS函数运行效率[仿PowerBuilder函数Fill()]
作者:
标题: 怎样提高自定义VBS函数运行效率[仿PowerBuilder函数Fill()] 上一主题 | 下一主题
donpps
初级用户





积分 56
发帖 20
注册 2006-4-23
状态 离线
『楼 主』:  怎样提高自定义VBS函数运行效率[仿PowerBuilder函数Fill()]

PowerBuilder中有个函数Fill(),但是VBS中没有完全相同的(String() 函数有点点相似),功能如下:

函数 Fill () 功能  建立一个由指定字符串填充的指定长度的字符串。
语法  Fill ( chars, n )
参数1  chars:字符串类型,指定用于重复填充的字符串;
参数2  n:长整类型,指定由该函数返回的字符串的长度;
返回值  字符串类型,函数执行成功时返回n个字符的字符串,该字符串以参数chars中的字符串重复填充而成;
如果参数chars中的字符个数多于n个,那么使用chars字符串的前n个字符填充函数返回的字符串;
如果参数chars中的字符个数少于n个,那么使用chars字符串反复填充,直到返回的字符串长度达到n为止;
如果任何参数的值为NULL,Fill()函数返回NULL。

现在用VBS模拟这个函数,写了一段脚本,请问怎样提高效率!

------------------------------------代码 1-------------------------------------
Dim chars,n
chars = "wert"
n = 256
MsgBox VBS_Fill(chars,n)

Function VBS_Fill(chars,n)
Dim i,k

chars = CStr(chars)
n = CLng(n)
If ((n = 0) Or (n = NUL) Or (chars = NUL)) Then
  Fill_PB = NUL
Else
  k = n \ (Len(chars)) + 1
  For i=1 To k
    chars = chars & chars
  Next

  VBS_Fill = Mid (chars,1,n)
End If

End Function
----------------------------------------------------------------------------------
n 的取值稍大就会死机!

------------------------------------代码 2-------------------------------------
Dim chars,n
chars = "wertq"
n = 1023
MsgBox VBS_Fill(chars,n)

Function VBS_Fill(chars,n)
Dim i,k
Dim char()
chars = CStr(chars)
n = CLng(n)
If ((n = 0) Or (n = NUL) Or (chars = NUL)) Then
  VBS_Fill = NUL
Else
  k = n \ (Len(chars)) + 1
  ReDim Preserve char(k)
  For i=1 To k
    char(i) = chars
  Next

  VBS_Fill = Join (char,"")
  VBS_Fill = Mid (VBS_Fill,1,n)
End If

End Function
----------------------------------------------------------------------------------
使用数组,大大加快,但是 n 的取值大于1023后与1023的结果一样。数组的下标上界是多少?是数组的问题吗?
还有更好的方法吗!
------------------------------------代码 3-------------------------------------
Dim chars, n
chars = "wertq6"
n = 1024
MsgBox VBS_Fill (chars, n)

Function VBS_Fill (chars, n) '0 < n < 1024

Dim i,j
Dim char()
chars = CStr (chars)
n = CLng(n)
If ((n = 0) Or (n = NUL) Or (chars = NUL)) Then
  VBS_Fill = NUL
Else
  i = Len (chars)
  j = n Mod i
  VBS_Fill = Replace (Space (n - j), Space (i), chars, 1) & Left (chars, j)
End If

End Function
----------------------------------------------------------------------------------
代码3没使用循环,速度与代码2相差不多。看样子n的取值与数组下界无关。
谢谢!

[ Last edited by donpps on 2008-4-3 at 10:54 PM ]

2008-4-3 17:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

Dim chars,n
chars = "slore"
n = 2048
MsgBox Len(VBS_Fill(chars,n))

Function VBS_Fill(chars,n)
   
Dim i,k
    Dim char()
   
chars = CStr(chars)
   
n = CLng(n)
   
If ((n = 0) or (n = vbNullChar) or (chars = vbNullChar)) Then
        
VBS_Fill = vbNullChar
    Else
        
k = n \ (Len(chars))
        
ReDim char(k)
        
For i = 0 To k
            char(i) = chars
        Next

        
VBS_Fill = Join(char,"")
        
VBS_Fill = Mid (VBS_Fill,1,n)
   
End If

End Function


知道什么原因麽?
msgbox显示的字符串是有限的。len的话可以看到没有问题。
应该最后一个用replace的速度会快些。。。
你可以测试比较大的数字看看看吧。

2008-4-4 19:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
donpps
初级用户





积分 56
发帖 20
注册 2006-4-23
状态 离线
『第 3 楼』:  

非常感谢 slore 的指点和修正,确实 msgbox 显示的字符串是有限的,好像只与字符有关,最多可以表示1023个字母、数字或汉字。

2008-4-6 10:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: