经典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 
+0

你怎么知道它不是基于你的样品?它已经排序。你也不需要变量num。既然你给'ubound(a)'加1,然后使用num-1,那么使用'ubound(a)'是有意义的。另外,你可能在j循环的最后一次迭代中从你的函数中被抛弃了。当i ='num-1'(数组的末尾)时,j将尝试成为'i + 1'。这超出了数组的界限,并且“a(i) 2011-04-19 11:18:32

通过函数调用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) 

call sort(mitta) 

就是这样,只需添加关键字call。完整的参考文献is available here

顺便说一句,你的代码有问题。这些数组是基于0的。

+0

如果他传递数组作为参考,他不应该返回任何东西。 – 2011-04-19 11:12:02

+0

@Joel:我修改了我的答案。 VBScript似乎并不尊重ByVal/ByRef。它强制ByVal用于“正常”变量和ByRef用于对象。 – 2011-04-19 11:30:41

当你传递一个object作为参数,你传递一个pointerobject,而不是object本身(这适用于我知道所有语言)。所以,如果你传递ByValByRef,因为根据定义,你总是传递pointer(参考对象)