Почему я получаю «индекс вне диапазона», когда индекс находится в диапазоне? - PullRequest
3 голосов
/ 02 октября 2009

Я работаю с каким-то устаревшим кодом спагетти, который обрабатывает некоторые волосатые EDI. Большая часть кода не поддается расшифровке и не имеет отступов, комментариев или даже хороших имен переменных, но есть одна строка, которая доставляет мне неприятности, когда я удаляю оператор On Error Resume Next, из-за которого сценарий всегда отключается.

If UBound(arylin) >= 1 Then
    Do Until arylin(0) = "PB" and arylin(1) = "DEF"
        ' Processing goes here - not relevant for this
    Loop
End If

Сценарий выполняет условные, но с ошибками в строке «До», говоря:

Microsoft VBScript runtime error '800a0009' 

Subscript out of range: '[number: 0]' 

Теперь, почему на Земле это выдает ошибку, если я проверяю верхнюю границу перед проверкой, и она говорит, что верхняя граница равна по крайней мере 1?

Я могу опубликовать больше кода, если придется, но я бы предпочел, потому что мой предшественник был полным взломом, а код очень уродливый.

Ответы [ 2 ]

3 голосов
/ 02 октября 2009

UBound() возвращает индекс последнего элемента в массиве. По умолчанию массивы на языках vb до vb.net начинаются с 1, а не с 0 (это означает, что число и индекс, как правило, одно и то же, хотя вы можете изменить значение по умолчанию с помощью Option Base).

Соедините их вместе, и вы увидите, что у них это не получается:

arylin(0) = "PB"
3 голосов
/ 02 октября 2009

См. Комментарий AnthonyWJones)
(С помощью VB вы можете установить базу массивов, начиная с 0 или 1 - она ​​должна быть в верхней части модуля или рядом с ней: ищите Option Base 1 или Option База 0.)

LBound всегда будет возвращать 0. (Вы также можете использовать LBound () для проверки нижней границы массива.)
(Просто покажу: не ожидайте, что MS будет последовательной!)

Несмотря на то, что вы проверяете, что размер массива> = 1 - это гарантирует, что arylin (0) действителен, но не обязательно arylin (1). Индекс начинается с нуля, поэтому, если существует один элемент, он будет иметь индекс = 0, а индекс = 1 будет выходить за пределы.

Вы должны проверить, что размер массива> = 2 в этом случае. Если вы используете две записи, следующие друг за другом последовательно, то необходимо выполнить проверку для (размер массива) mod 2 = 0.

Также убедитесь, какое значение действительно возвращает UBound. Я погуглил и получил противоречивую информацию: этот говорит, что он возвращает 'count', тогда как этот говорит, что он возвращает физический предел (= 'count' -1).

Об элементе «При ошибке продолжить следующее», возможно, он должен остаться там ...

...