необъяснимое падение, исправленное излишним назначением - PullRequest
0 голосов
/ 03 января 2019

Я тестировал крошечный фрагмент, который я написал для форматирования временного интервала (например, last change 5m23s ago), и продолжал получать ошибку, которую я не мог понять.Каждый раз, когда я пытаюсь использовать переменную цикла i непосредственно при вызове ts(), ASP сообщает мне An error occurred...

'the function
function ts(s)
    dim m: m = CLng(s \ 60): s = s mod 60
    dim h: h = CLng(m \ 60): m = m mod 60
    ts = right("00" & h, 2) & "h" & _
         right("00" & m, 2) & "m" & _
         right("00" & s, 2) & "s" 
end function 

'the test
for i = 0 to 90000 step 15 
   '               response.write i & ": " & ts(i) & "<br />" 'an error has occurred
    dim j: j = i : response.write i & ": " & ts(j) & "<br />" 'works fine
next 

Что здесь происходит в мире?

Почему ts(i) каждый раз создает ошибку?
Учитывая это, почему j=i : ts(j) работает нормально?

Это не может быть проблемой с переменной i, так как она отлично работает с вызовом записи.Вот некоторые другие вещи, которые я попробовал:

response.write i & ": "                     'no problem
'response.write ts(i)                       'crashes
'dim x: x = ts(i)                           'crashes
dim j: j = i                                'no problem
dim x: x = ts(j)                            'works
response.write x & "<br />"                 'works 
'response.write ts(j) & "<br />"            'also works 
'response.write i & ": " & ts(j) & "<br />" 'also works 

(Наконец, я знаю, что якобы есть способ заставить IIS отображать реальные ошибки. Мне бы хотелось услышать, как это сделать без доступа RDP к веб-серверу.)

1 Ответ

0 голосов
/ 03 января 2019

omegastripes объяснил мне.

Очевидно, в VBScript по умолчанию для параметров передаются ByRef erence.
(Буквально любой другой язык программирования, который у меня когда-либо былпримитивы used pass ByVal ue)

Это вызвало проблему, когда я изменил значение s внутри функции.

Любой из этих фрагментов работает просто отлично:

function ts(ByVal s)
    ...
...
ts(i)

function ts(sec)
    dim s: s = sec
    ...
...
ts(i)

(или, как упомянуто в OP, передает значение в переменную без итератора цикла)

function ts(s) 
... 
dim j: j = i: ts(j) 
...