1

従来の 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」を返します。

コードが配列を下に流れ、関数に従って対応する値を返すようにするために何をする必要がありますか?

4

2 に答える 2

3

VBScript には暗い面があります。変数のスコープはその 1 つです。

変数を宣言しない場合は、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

そして、それは別の変数になり、オーバーフローはありません。

于 2013-06-12T10:45:09.507 に答える
1

EVIL グローバル変数 i がトップ レベル ループと関数 shift() および translate_url() で使用されているため、当然の結果が得られます。

証拠:ループを次のように変更するだけです

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

対処法: 「Option Explicit」を使用し、Subs/Functions/Methods 内のすべてのローカル変数を Dim します。

于 2013-06-12T11:15:13.440 に答える