3

我有一个数组,我通过引用传递给一个函数来对其进行排序。但是,似乎数组是按val传递的。任何人都可以解决什么问题?(也接受排序解决方法)


1) 下面的脚本通过引用传递一个数组到排序函数。

2) 排序函数输出排序后的数组值。

3) 脚本输出排序后的数组值。但是,它们没有排序。


脚本输出:

300,200,100,,

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
4

3 回答 3

7

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

规则是

3.1) 对返回值赋值的函数调用的参数列表必须用括号括起来:Result = MyFunc(MyArg)
3.2) 使用 Call 的子例程调用(或没有赋值的函数调用)的参数列表关键字必须用括号括起来:调用 MySub(MyArg)
3.3) 如果 3.1 和 3.2 不适用,则列表不能用括号括起来。

最后是 byref 规则:参数在可能的情况下通过 byref 传递,但如果变量周围有“额外的”括号,则该变量通过 byval,而不是 byref。

现在应该清楚为什么声明 MySub(MyArg) 是合法的而 MyOtherSub(MyArg1, MyArg2) 是不合法的。第一种情况似乎是在参数列表周围带有括号的子例程调用,但这违反了规则 3.3。那为什么合法呢?事实上,它是一个子例程调用,arg 列表周围没有括号,但第一个参数周围有括号!这会按值传递参数。第二种情况明显违反了规则 3.3,没有办法让它合法,所以我们给出一个错误。

另请参阅ByRef 和 ByVal 参数的 MSDN 参考。相反,您应该使用以下方式调用sort

sort mitta

或者:

Call sort(mitta)
于 2011-04-20T05:24:16.447 回答
3
call sort(mitta)

就是这样,只需添加关键字call。完整的参考资料可在此处获得

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

于 2011-04-19T11:08:40.493 回答
0

当您传递objectas 参数时,您将 a 传递pointerobject,而不是object本身(这适用于我知道的所有语言)。ByVal因此,传递它或传递它并不重要ByRef,因为根据定义,你总是传递一个pointer(对对象的引用)

于 2011-04-19T12:22:32.777 回答