【问题标题】:Stack overflow error when do a loop inside another loop在另一个循环中执行循环时出现堆栈溢出错误
【发布时间】:2013-06-12 03:19:22
【问题描述】:

在经典的 ASP 函数中,当我在另一个函数中执行循环时,如下面的代码所示,出现堆栈溢出错误。

Function shift(x,y)
    shift = x
    For i = 1 to y
    shift = shift*2
Next
End Function

Function translate_url(iVal)
sAlpha = "abcdefghijklmnopqrstuvwxyz-_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
doWrite = False
iBase = 63 'DO NOT CHANGE
For i = 4 to 0 step -1
    iPos = (iVal and shift(iBase, i*6))/shift(1, i*6)
    If iPos Then doWrite = True
    If doWrite Then translate_url = translate_url & Mid(sAlpha, iPos + 1,1)
Next
End Function

arr = Split("1,2,3,4,5,6,7,8,9,0",",")

For Each i In arr
response.Write(translate_url(arr(i)))
next

当我删除函数外的循环时不会发生错误。例如:

response.Write(translate_url(arr(1)))

返回“c”。

我需要做什么才能让代码顺着数组顺流而下,并根据函数返回对应的值?

【问题讨论】:

    标签: asp-classic vbscript stack-overflow


    【解决方案1】:

    VBScript 有阴暗面。变量作用域就是其中之一。

    当你不声明变量时,VBScript 会为你做这件事,免费或出错,并给它全局范围。

    这是什么意思?看看主循环:

    For Each i In arr
        response.Write(translate_url(arr(i)))
    next
    

    i 变量变为全局变量。当你稍后在函数中有这个时:

    For i = 4 to 0 step -1
        '...
    Next
    

    它正在改变相同的i 变量。这会导致函数调用无限循环。

    要解决此问题,请在每个函数中本地声明 i:

    Function shift(x,y)
        Dim i
        '...
    End Function
    
    Function translate_url(iVal)
        Dim i
        '...
    End Function
    

    它会是不同的变量,不会溢出。

    【讨论】:

    • 太棒了!比我想象的要简单得多。非常感谢!
    【解决方案2】:

    由于 EVIL 全局变量 i 用于您的顶级循环以及函数 shift() 和 translate_url(),因此您得到了应得的结果。

    证据:只需将循环更改为

    For Each NoliMeTangere In arr
      response.Write translate_url(arr(NoliMeTangere))
    next
    

    补救措施:使用“Option Explicit”并在您的 Subs/Functions/Methods 中调暗所有局部变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多