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)
通过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)