Инструменты пользователя

Инструменты сайта


Боковая панель

help:arrays

Это старая версия документа.


Назад: Программный код

Массивы

  • Массив - последовательный набор значений, имеющих один тип данных и обладающих одним названием.
  • Элементы массива идентифицируются по индексам.
    • Индексация ведётся с нуля. Т.е. элемент с индексом 0 - первый элемент массива, 1 - второй и т.д.
    • Максимальный индекс массива 2147483647.
  • Обращение к элементу массива происходит так: сначала указывается название массива, затем в квадратных скобках - числовое выражение, равное индексу элемента, к которому производится обращение.
  • На самом деле каждая переменная в QSP является массивом.
    яблоки = 0
    !эквивалентно
    яблоки[0] = 0
    
  • Соответственно для текстового массива нужно не забывать использовать символ '$' в имени.
  • Примеры:
    $яблоки[0]='антоновка'
    $яблоки[1]='белый налив'
    $яблоки[2]='астраханское'
    $яблоки[3]='ранетка'
    $яблоки[4]='симиренко'
    
    сорт_яблока[0] = 1
    сорт_яблока[1] = 2
    сорт_яблока[2] = 4
    
    *pl $яблоки[сорт_яблока[номер_яблока]]
    
  • Массивы могут индексироваться через строки. Регистр символов данной строки не имеет значения. Примеры:
    $любимый_сорт['иван'] = $яблоки[2]
    любимое_число['Алексей'] = 5
    $item_loc['палка'] = 'лес'
    
  • Существует упрощённый синтаксис чтения последнего и добавления нового элемента в массив. Если индекс элемента не указан:
    • при записи будет выбран элемент, следующий за последним. Например:
      $objs[] = 'Напильник' &! Если массив был пустой, то
      $objs[] = 'Топор'     &! [0] = 'Напильник',
      $objs[] = 'Доска'     &! [1] = 'Топор', [2] = 'Доска'
    • при чтении будет выбран последний элемент. Например:
      $a = $objs[] &! 'Доска' из примера выше
      a = сорт_яблока[] &! 4 из примера выше

Примечание: При добавлении в массив элемента со строковым индексом1) элемент добавляется в конец массива. Настоятельно не рекомендуется сочетать числовые и строковые индексы в пределах одного массива.

Примечание: В силу особенностей платформы числовые и текстовые массивы связаны между собой: добавление элемента в 'массив' добавляет пустой элемент в '$массив' и наоборот со всеми вытекающими последствиями.

Примечание: Настоятельно не рекомендуется использовать большие числовые индексы без необходимости.

Функции и операторы

  • KILLVAR [$название массива],[#индекс элемента] - удаление элемента массива.
    • Если индекс элемента не указан, то удаляется весь массив.
    • Если оператор вызван без аргументов, то удаляются все переменные
    • KILLALL - оператор эквивалентен конструкции "KILLVAR & KILLOBJ"2)
    • При удалении элемента все следующие за ним элементы сдвигаются на позицию вверх.
      a[0]=4
      a[1]=3
      a[2]=23
      a[3]=15
      KILLVAR 'a',1
      !теперь массив выглядит так:
      a[0]=4
      a[1]=23
      a[2]=15
      
    • Примеры:
      KILLVAR &! удаляет все переменные, массивы
      KILLVAR 'a' &! удаляет массив 'a'
      KILLVAR 'a',3 &! удалит из массива 'a' элемент с индексом 3.
      
  • COPYARR [$приёмник],[$источник],[#начало],[#количество] - копирование в массив-приёмник [#количество] элементов из массива-источника начиная с элемента под номером [#начало]. Размер массива-приёмника при копировании не имеет значения.
    • Параметр [#количество] является необязательным. По умолчанию - до конца массива-источника.
    • Параметр [#начало] является необязательным. По умолчанию - 0
    • В силу особенностей движка при копировании массива 'массив1' в 'массив2' копируется также '$массив1' в '$массив2'.
    • Примеры:
      COPYARR '$a','$b'
      COPYARR 'a','b'
      COPYARR $arrname1,$arrname2,10,5
      COPYARR 'a<<$arrname1>>','a<<$arrname2>>'
      
  • ARRSIZE([$имя]) - функция возвращает число элементов в массиве с названием [$имя].
    • В силу особенностей движка возвращается наибольшее из числа элементов 'массива' и '$массива'.
    • Примеры:
      n = ARRSIZE('a')
      n = ARRSIZE('$a')
      !Результат будет одинаковый
      
  • ARRPOS([#начало],[$имя_массива],[значение]) - возвращает индекс элемента массива, равного значению. Поиск начинается с элемента с заданным номером; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает -1.
    • Параметр [#начало] может отсутствовать, при этом он принимается равным 0.
    • Важно: в более новых версиях (Quest Navigator) необязательный параметр [#начало] переставлен последним3).
    • Примеры:
      !Поиск строки 'This' в текстовом массиве "$A"
      ARRPOS(0,'$A','This')
      !Поиск числа 65 в массиве "A" (два элемента массива игнорируются)
      ARRPOS(2,'A',65)
      !Поиск строки 'test' среди значений массива "$B"
      ARRPOS('$B','test')
      
  • См. также функции "MAX, MIN" (Программный код)
  • ARRCOMP([#начало],[$имя_массива],[$шаблон]) - возвращает индекс элемента массива, соответствующего регулярному выражению. Поиск начинается с элемента с заданным номером; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает -1.
    • Поиск работает только по текстовым массивам (символ '$' в названии можно опустить).
    • Параметр [#начало] может отсутствовать, при этом он принимается равным 0.
    • Важно: в более новых версиях (Quest Navigator) необязательный параметр [#начало] переставлен последним4).
    • Примеры:
      !Поиск строки 'This' среди элементов массива "$A"
      ARRCOMP(0,'A','This')
      !'Поиск строки, соответствующей регулярному выражению "abc\d+"
      (первые два элемента массива игнорируются)'
      ARRCOMP(2,'A','abc\d+')
      !'аналогично предыдущему примеру, но поиск осуществляется
      по всем элементам массива'
      ARRCOMP(0,'A','.*string.*') 
      
      ARRCOMP('A','This') &! эквивалентно 1му варианту
      

См. также: Продвинутое использование массивов


Вперёд: Строки

1) массив['строка'] = значение
2) обычно применяется в начале игры, чтобы при возврате в начальную локацию после неудачного прохождения какого-то этапа игры обнулить все переменные (в противном случае, может оказаться, что запертые двери уже открыты, жена похищена до свадьбы, а Баба-Яга уже отдала кому-то нужный клубочек)
3) ARRPOS([$имя_массива],[значение],[#начало])
4) ARRCOMP([$имя_массива],[$шаблон],[#начало])
help/arrays.1417636863.txt.gz · Последние изменения: 2014/12/03 23:01 (внешнее изменение)