![]() |
中国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 |