|
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 |
|
|