Урок 9 по VBScript: Массивы

Урок 9 по VBScript: Массивы Программирование на VBSCRIPT

В этой стать мы изучим vbscript массивы и функции для работы с ними. Массивы языка vbscript могут быть как одномерными, так и многомерными, нумерация элементов массива начинается с нуля. Если не прибегать к дополнительным функциям, то объявление массива в языке vbscript подобно объявлению переменной, только после имени переменной следуют круглые скобки. Если в круглых скобках ничего нет, то массив является динамическим – его длину можно изменять.

Вот простые примеры:

dim my_arr(10)            '11 элементов
dim my_matrix(3,4)        ' матрица размером 4 (строки) на 5 (столбцов)
dim my_dyn()               'динамический

Присвоение значений производится через индекс:

my_arr(0) = 100
my_arr(1) = "строка"
my_arr(2) = #10/05/2000#
 
my_matrix(0,0) = 25
my_matrix(0,1) = 250
my_matrix(2,3) = 2.5

Если мы объявили динамический массив vbscript, то для подальшего определения его размера служит ключевое слово ReDim:

ReDim my_dyn(50)

Вы вправе менять размерность неограниченное количество раз. Что бы произвести сохранение уже имеющейся информации используется ключевое слово Preserve:

ReDimPreserve my_dyn(80)

Что бы полностью очистить содержимое, применяется команда Erase:

Erase my_matrix

Но как вы уже заметили, приведенный выше подход не совсем практичен, особенно, в плане назначения значений, поэтому, давайте рассмотрим функции для работы с массивами языка vbscript.

Array(arglist) – В качестве параметра arglist передаются аргументы массива, которые разделены между собой запятыми, например:

'*****************************************
' vbscript массивы
' array_1.vbs
'*****************************************
Option Explicit
 
dim new_arr(4), i, s
dim my_arr, index, list
 
new_arr(0) = 0
new_arr(1) = "строка"
new_arr(2) = 33.5
new_arr(3) = 100
new_arr(4) = #10/05/2000#
 
for each i in new_arr
     s = s & i & vbCrLf 
next
 
MsgBox s
 
my_arr = Array(0,"строка",33.5,100,#10/05/2000#)
for each index in my_arr
     list = list & index & vbCrLf 
next
 
MsgBox list

В данном примере мы создали два vbscript массива: new_arr – обычным способом и my_arr – с помощью функции Array, второй подход более эффективен, так как экономит строки кода.

Скачать архив с примерами

IsArray(varname) – Данная функция позволяет определить, является ли переменная  varname массивом, если да, то функция вернет true, и false в противном случае.

UBound (имяМассива [, измерение]) — Позволяет определить верхнюю границу массива (имяМассива), параметр [,измерение] не является обязательным, он актуален в том случае, если происходит работа с многомерными. Параметры [,измерение] принимает целые значения, начиная от 1, по умолчанию параметр [, измерение] равен 1. Пример:

'*****************************************
' vbscript массивы
' функция UBound
' UBound.vbs
'*****************************************
Option Explicit
 
dim matrix(2,3)
dim a, b
matrix(0,0) = 2
matrix(0,1) = 4
matrix(0,2) = 5
 
matrix(1,0) = 4
matrix(1,1) = 5
matrix(1,2) = 99
matrix(1,3) = 6
 
a = UBound(matrix,1)
b = UBound(matrix, 2)
 
MsgBox a
MsgBox b
 
MsgBox matrix(1,2)

LBound(arrayname[, dimension]) – Аналог предыдущей функции, но выводит нижнюю границу.

Хорошо, теперь давайте рассмотри более серьезные виды массивов языка vbscript.

Массив массивов – такого вида конструкция может привести новичка в заблуждение, и он подумает, что перед ним двумерный, хотя это ошибка, смотрим на пример:

'*****************************************
' vbscript массивы
' array_2.vbs
'*****************************************
Option Explicit
 
dim new_arr, s, i,j
dim a, b
 
s=""
 
' Это не двумерный!!!
new_arr = Array(Array(2,4,5), Array(8,5,99,6))
 
for i=0 to 2
     s=s & " " & new_arr(0)(i)
next
s=s & vbCrlf
for j=0 to 3
     s=s & " " & new_arr(1)(j)
next
MsgBox s

В данном примере vbscript массив new_arr является одномерным и состоит из двух значений, при чем, каждое значение является также одномерным массивом. Видим, что в предыдущем примере мы использовали синтаксис вида: matrix(1,2), а тут — new_arr(1)(j). Различие, как говорится – на лицо.

Функция в качестве значения. Может возникнуть ситуация, когда надо сохранить не просто значение, а функцию, вот тут то и происходит головная боль. Давайте взглянем на следующий пример:

'*****************************************
' vbscript массивы
' вызов функции
' array_3.vbs
'*****************************************
 
dim new_arr(4), i, s
 
function new_fun(x,y)
    new_fun=x+y
end function
 
function new_fun_1(x,y)
    new_fun_1=x+y
end function
 
new_arr(0) = 0
new_arr(1) = "строка"
 
'Создаем ссылку на функцию
set new_arr(2) = getref("new_fun")
 
' Так делать неправильно
new_arr(3) = new_fun_1(x,y)
new_arr(4) = #10/05/2000#
 
MsgBox new_arr(2)(10,5)
' Ошибка!!!
MsgBox new_arr1(2)(10,5)

В данном примере мы объявили две функции, мы попробовали определить их в качестве параметра массива. В первом случае (new_fun_1) мы просто присвоили имя функции:

new_arr(3) = new_fun_1(x,y)

Вторую функцию (new_fun) мы присвоили с помощью ключевого слова set и функции getref().

Создание сложного vbscript массива

Попытка вызвать первую функцию приводит к ошибке, вторая – прекрасно вызывается с передачей ей параметров. Давайте разберёмся, в чем причина. В первом случае индекс массива vbscript содержит функцию, как значение – без параметров, оно равно 0, поэтому мы не может её вызвать. Во втором случае мы создали ссылку (set) на нужную функцию, сама ссылка получена за счёт функции getref().

Ладно, думаю, изучение vbscript массивов на этом можно закончить.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий

  1. Александр

    Владимир, у меня вот такая проблема:

    Происходит парсинг XML в двумерный массив (успешно)
    ….
    array(0,1)=’ID’
    array(1,1)=123444
    array(0,2)=’Version’
    array(1,2)=2

    Размерность массива array(1,78).

    Задача:
    Необходимо найти в массиве значение для поля ID и передать ее в переменную.
    Что то с алгоритмом никак не могу разобраться:
    For i=LBound(array,1) to Ubound (array,1)
    For j=Lbound(array,1) to Ubound(array,1)
    If array(0,j)=’ID’ Then
    ID=array(1,j)
    End If
    MsgBox ‘New ID is:’ & array(1,j) , 64
    Next
    Next
    это не работает.

    Ответить
    1. Coding автор

      dim array(78,1)
      dim ID
      ID=’ ‘

      array(0,0)=’ID’
      array(0,1)=123444
      array(1,0)=’Version’
      array(1,1)=2
      array(2,0)=’ID’
      array(2,1)=22.5

      For i=LBound(array,1) to Ubound (array,1)
      For j=Lbound(array,2) to Ubound(array,2)
      if j=0 then
      if array(i,0)=’ID’ Then
      ID=array(i,1)
      MsgBox ‘New ID is: ‘ & ID, 64
      end if
      End If
      Next
      Next
      Теперь работает

      Ответить
    2. Coding автор

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

      Ответить
    3. Coding автор

      Напишите, помог ли Вам мой ответ.

      Ответить
  2. Александр

    Владимир, добрый день! Я допустил неточность =(, не указал что ID присутствует в одном экземпляре в массиве.

    Ваш код работает абсолютно корректно и он вытаскивает все значения для ID!

    После парсинга у меня заполнен двумерный массив:

    arr(0,0) = ‘ID’ — название поля
    arr(1,1)=12344 — значение поля ID ( 12334).
    arr(0,1)=‘Version’ название поля
    arr(1,2)=2 — значение поля Version (2)
    arr(0,3)=‘City’
    arr(1,3)=Moscow и т.п.

    Цикл должен найти в массиве DatabaseID (0,j) и вывести его значение (1,j) в переменную и после этого цикл должен закончиться.

    Ответить
  3. Александр

    Владимир, привет!
    Ниже вариант который работает:
    sFnd = "ID"
    For i = 0 To UBound(array, 2)
    If sFnd = pAllLegs(0, i) Then
    Id = pAllLegs(1, i)
    Exit For
    End If
    Next

    Ответить