经典asp:按引用调用函数不适用于数组

vil*_*jun 3 arrays pass-by-reference byref asp-classic

我有一个数组女巫我通过引用传递给函数来排序它.但是,似乎数组是通过byval传递的.任何人都可以解决问题吗?(也接受排序变通办法)


1)下面的脚本通过引用将数组传递给sort函数.

2)排序功能输出排序的数组值.

3)脚本输出排序的数组值.但是他们没有排序.


脚本输出:

300200100 ,,

100,200,300,


'declare variables
mitta(1) = 1
mitta(2) = 2
mitta(3) = 3

sort(mitta)  ' see the function below

' show variables
For i = 1 To 3
    response.write mitta(i) & ","
next

' sort function
function sort(byref a)
    dim num,i,j,temp
    num = ubound(a)+1
    For i = 0 To num - 1
       For j = i + 1 To num - 1
          If a(i) < a(j) Then
             temp = a(i)
             a(i) = a(j)
             a(j) = temp
          End If
       Next
    Next

    ' show sorted variables
    For i = 0 To num - 1
        response.write a(i) & ","
        a(i) = 0
    next
end function
Run Code Online (Sandbox Code Playgroud)

Che*_*vel 7

通过mitta在函数调用中括起括号sort(mitta),您实际上是按值传递它,尽管函数声明.来自http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx:

规则是

3.1)具有对返回值的赋值的函数调用的参数列表必须由parens包围:Result = MyFunc(MyArg)
3.2)使用Call的子例程调用(或没有赋值的函数调用)的参数列表关键字必须被parens包围:调用MySub(MyArg)
3.3)如果3.1和3.2不适用,则列表不得被parens包围.

最后是byref规则:参数在可能的情况下通过参数传递,但如果变量周围有"额外"的parens,那么变量将按值传递,而不是byref传递.

现在应该清楚为什么语句MySub(MyArg)是合法的,但MyOtherSub(MyArg1,MyArg2)不是.第一种情况似乎是在参数列表周围使用parens的子例程调用,但这违反了规则3.3.那为什么合法呢?实际上它是一个子程序调用,在arg列表周围没有任何parens,但围绕第一个参数的parens!这会按值传递参数.第二种情况明显违反了规则3.3,并且没有办法使其合法,因此我们给出了错误.

另请参阅ByRef和ByVal参数的MSDN参考.相反,你应该调用sort:

sort mitta
Run Code Online (Sandbox Code Playgroud)

要么:

Call sort(mitta)
Run Code Online (Sandbox Code Playgroud)