中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-08 00:30
48,041 主题排行 / 350,128 发帖 / 今日 3 篇 / 48,253 会员排行
DOS批处理 & 脚本技术(批处理室) » 怎样提高自定义VBS函数运行效率[仿PowerBuilder函数Fill()]
可打印版本  1,170 / 2
第1楼 donpps 发表于 2008-04-03 17:17
初级用户 发帖 20 积分 56
怎样提高自定义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 ]
第2楼 slore 发表于 2008-04-04 19:13
铂金会员 发帖 2,478 积分 5,212
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的速度会快些。。。
你可以测试比较大的数字看看看吧。
第3楼 donpps 发表于 2008-04-06 10:59
初级用户 发帖 20 积分 56
非常感谢 slore 的指点和修正,确实 msgbox 显示的字符串是有限的,好像只与字符有关,最多可以表示1023个字母、数字或汉字。
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023