Я не могу создать неопределенный массив в VBS.
Это должно быть столько, сколько нужно. Я не хочу объявлять какое-то ограничение вроде 10 или около того для Dim arrnode(10)
. Мне нужен безлимитный.
Я старался:
Dim arrnode
arrnode(1) = "a"
arrnode(2) = "b"
arrnode(3) = "c"
arrnode(4) = "d"
И множество вариаций вроде:
Dim arrnode()
Dim arrnode() As Variant
Dim arrnode() As Variant()
И т. Д. И т. Д. Ничего из этого не работает. Только ошибки.
Приведите пример, который работает. Я не ищу объяснений, так как не могу понять «вариантное» объяснение, которое я постоянно находил в Интернете. Мне просто отчаянно нужен очень простой работающий массив.
data = Array(00,01,02,03,04,05,06)
. Не нужен Dim data
Есть разные способы создания массивов в VBScript
Массивы определенного размера
Dim arrTest1(3)
arrTest1(0) = "1"
arrTest1(1) = "2"
arrTest1(2) = "3"
arrTest1(3) = "4"
Массивы без определенного размера
Dim arrTest2()
ReDim arrTest2(3)
arrTest2(0) = "1"
arrTest2(1) = "2"
arrTest2(2) = "3"
arrTest2(3) = "4"
Использование функции Array
для создания массива
Dim arrTest3
arrTest3 = Array ("1", "2", "3", "4")
В VBScript массивы начинаются с нуля, и вы не можете определить тип переменной (например, as Variant
) при объявлении массивов.
Вы можете использовать второй вариант, если не уверены в размере массива. Вы всегда можете ReDim
позже изменить его размер. Не забудьте использовать ключевое слово Preserve
, если вы хотите защитить данные массива, если вы ReDiming
.
Спасибо за быстрый ответ. Кажется, так или иначе придется определять размер. Странно то, что однажды я разделил строку на 2 части на переменную x с помощью команды Split, и я автоматически получил массив с x (0) и x (1). Я никогда не делал тусклый X () или что-то в этом роде. Таким образом, создание массива оказалось намного проще, чем ожидалось, кажется довольно сложным. Мне просто нужно создать Const в начале скрипта, чтобы определить размер массива. Я сдаюсь!
Split
вернет массив. Вы можете создать сценарий, в котором вы можете спросить пользователей, сколько значений они хотят ввести, и создать на основе этого массив. Или используйте более гибкие объекты Dictionary
.
Большинство людей используют словари вместо массивов.
Вы просто извергаете старые ответы, вместо этого помечаете их как повторяющиеся и двигаетесь дальше.
Чтобы создать статический (неизменяемый) массив с 10 слотами, используйте
Dim arr(9)
Для создания динамического (изменяемого размера) массива с 10 слотами используйте
ReDim arr(9)
В каждом случае аргументом является верхняя граница массива. Поскольку массивы VBScript начинаются с нуля (индексы начинаются с 0), это количество элементов минус один.
Если вы хотите добавить массив, не зная заранее требуемый размер, создайте его как пустой динамический массив:
ReDim arr(-1)
Для добавления к этому массиву вам нужно сначала увеличить его размер:
ReDim Preserve arr(UBound(arr)+1)
arr(UBound(arr)) = "a"
ReDim Preserve arr(UBound(arr)+1)
arr(UBound(arr)) = "b"
...
Вы можете обернуть это процедурой, чтобы немного упростить обработку:
Sub AppendToArray(ByRef a, v)
ReDim Preserve a(UBound(a)+1)
a(UBound(a)) = v
End Sub
AppendToArray arr, "a"
AppendToArray arr, "b"
...
Однако помните, что изменение размера массива при сохранении его содержимого - медленная операция, потому что VBScript создает новый массив с увеличенным размером, перемещает содержимое существующего массива, а затем заменяет существующий массив новым.
В противном случае VBScript не поддерживает динамическое добавление к массиву. В качестве альтернативы вы можете использовать класс System.Collections.ArrayList
, который поддерживает динамическое изменение размера:
Set arr = CreateObject("System.Collections.ArrayList")
arr.Add "a"
arr.Add "b"
...
Спасибо за быстрый ответ. Мне придется поработать с этими инструментами. Было бы неплохо поместить в начало скрипта константу, объявляющую размер массива. Пока dim (c) не работает. Может ReDim жрет константу.
Dim
работает только с литералами. Но, как я уже писал, размер результирующего массива все равно нельзя будет изменить, так что это не то, что вам нужно. ReDim
также работает с переменными и константами.
Я как раз приводил пример использования словаря в качестве объекта, подобного массиву, а потом увидел ваш пост. ArrayList действительно был бы лучшим способом. +1
@Tim не нужно, когда можно было просто посмотреть на один из существующие(кстати, Ансгар, это связывает одного из ваших).
Я нашел три дубликата. Если бы вы прочитали Как спросить перед публикацией, вы бы натолкнулись хотя бы на один из них при поиске.