经典asp:通过引用函数调用不能用于数组
我有一个数组女巫我传递给函数通过引用来排序它。但是,好像数组是通过byval。任何人都可以解决什么问题? (也可接受排序解决方法)经典asp:通过引用函数调用不能用于数组
1)以下脚本将数组引用传递给sort函数。
2)Sort函数输出排序的数组值。
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
通过函数调用sort(mitta)
括号包装mitta
不要紧,你实际上传递按价值,尽管函数声明。从http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx:
规则是
3.1)的自变量列表,用于与分配给 返回值的函数调用必须由 括号包围:结果= MYFUNC(MyArg)
3.2)使用呼叫关键字 的子程序呼叫的参数列表必须包含在parens中:呼叫 MySub(MyArg)
3.3)如果3.1和3.2不适用,则列表必须不被包围 parens。最后还有就是按地址规则: 参数传递时 可能的,但如果有“额外” 围绕一个变量,则 变量传递BYVAL,不按地址括号按地址。
现在应该清楚为什么 声明MySub(MyArg)是合法的,但是 MyOtherSub(MyArg1,MyArg2)不是。 第一个案例似乎是一个子例程 与参数 列表中的parens调用,但这会违反规则3.3。 那为什么它是合法的?实际上它是一个 子程序调用没有parens 左右的arg列表,但是第一个参数围绕 !按值传递参数 。第二种情况是 明显违反规则3.3,并且 没有办法使它合法,所以我们给出 错误。
另请参阅ByRef and ByVal Parameters的MSDN参考。相反,你应该叫sort
要么:
sort mitta
或:
Call sort(mitta)
如果他传递数组作为参考,他不应该返回任何东西。 – 2011-04-19 11:12:02
@Joel:我修改了我的答案。 VBScript似乎并不尊重ByVal/ByRef。它强制ByVal用于“正常”变量和ByRef用于对象。 – 2011-04-19 11:30:41
当你传递一个object
作为参数,你传递一个pointer
到object
,而不是object
本身(这适用于我知道所有语言)。所以,如果你传递ByVal
或ByRef
,因为根据定义,你总是传递pointer
(参考对象)
你怎么知道它不是基于你的样品?它已经排序。你也不需要变量num。既然你给'ubound(a)'加1,然后使用num-1,那么使用'ubound(a)'是有意义的。另外,你可能在j循环的最后一次迭代中从你的函数中被抛弃了。当i ='num-1'(数组的末尾)时,j将尝试成为'i + 1'。这超出了数组的界限,并且“a(i) 2011-04-19 11:18:32