Классический asp: вызов функции по ссылке не работает с массивом - PullRequest
3 голосов
/ 19 апреля 2011

У меня есть массив, который я передаю функции по ссылке, чтобы отсортировать ее. Однако, похоже, что массив передан byval. Кто-нибудь может решить в чем проблема? (Также можно сортировать обходные пути)


1) Сценарий ниже передает ссылку на массив в функцию сортировки.

2) Функция сортировки выводит отсортированные значения массива.

3) Скрипт выводит отсортированные значения массива. Однако они не отсортированы.


Сценарий выводит:

300200100 ,,

100200300


'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

Ответы [ 3 ]

7 голосов
/ 20 апреля 2011

Заключая mitta в скобки при вызове функции sort(mitta), вы фактически передаете его по значению, несмотря на объявление функции.С http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx:

Правила:

3.1) Список аргументов для вызова функции с присваиванием возвращаемому значению должен быть заключен в скобки: Result = MyFunc (MyArg)
3.2) Список аргументов для вызова подпрограммы (или вызова функции без назначения), который использует ключевое слово Call, должен быть заключен в паренсы: Call MySub (MyArg)
3.3) Если 3.1 и 3.2 не применяются, тосписок НЕ должен быть окружен паренами.

И, наконец, существует правило byref: аргументы передаются byref, когда это возможно, но если есть «лишние» парены вокруг переменной, тогда переменная передается byval, а не byref.

Теперь должно быть понятно, почему утверждение MySub (MyArg) является законным, а MyOtherSub (MyArg1, MyArg2) - нет.Первый случай - это вызов подпрограммы с паренями вокруг списка аргументов, но это нарушит правило 3.3.Тогда почему это законно?На самом деле это вызов подпрограммы, в котором нет аргументов вокруг списка аргументов, но есть аргументы вокруг первого аргумента! Это передает аргумент по значению.Второй случай является явным нарушением правила 3.3, и его нельзя сделать легальным, поэтому мы сообщаем об ошибке.

См. Также ссылку на MSDN для параметров ByRef и ByVal .Вместо этого вы должны позвонить sort с:

sort mitta

или:

Call sort(mitta)
3 голосов
/ 19 апреля 2011
call sort(mitta)

Вот и все, просто добавьте ключевое слово call.Полная ссылка доступна здесь .

Кстати, ваш код имеет проблемы.Массивы основаны на 0.

0 голосов
/ 19 апреля 2011

Когда вы передаете object в качестве параметра, вы передаете pointer в object, а не в object (это относится ко всем языкам, которые я знаю). Поэтому не имеет значения, передаете ли вы его ByVal или ByRef, потому что по определению вы всегда передаете pointer (ссылку на объект)

...