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

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


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

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му варианту
      

Двумерные массивы с числовыми индексам

Пример симуляции двумерного массива

! Индексы i1  0..8
i1_max=9    

! Индексы i2  0..5
i2_max=6

! Заполнение данных массива 
i1=0
:ПрыгЗадатьМассив1
	i2=0
	:ПрыгЗадатьМассив2
		$ДвумерныйМассив[i1*i2_max+i2]='[<<i1>>,<<i2>>]'
		i2+=1
	if i2<i2_max : Jump 'ПрыгЗадатьМассив2'
i1+=1
if i1<i1_max : Jump 'ПрыгЗадатьМассив1'


! Вывод данных массива
i1=0
:ПрыгВыводМассива1
	*Nl 
	i2=0
	:ПрыгВыводМассива2
		*P $ДвумерныйМассив[i1*i2_max+i2]+'  '
		i2+=1
	if i2<i2_max : Jump 'ПрыгВыводМассива2'
i1+=1
if i1<i1_max : Jump 'ПрыгВыводМассива1'
*Nl 

!{Результат 
[0,0]  [0,1]  [0,2]  [0,3]  [0,4]  [0,5]  
[1,0]  [1,1]  [1,2]  [1,3]  [1,4]  [1,5]  
[2,0]  [2,1]  [2,2]  [2,3]  [2,4]  [2,5]  
[3,0]  [3,1]  [3,2]  [3,3]  [3,4]  [3,5]  
[4,0]  [4,1]  [4,2]  [4,3]  [4,4]  [4,5]  
[5,0]  [5,1]  [5,2]  [5,3]  [5,4]  [5,5]  
[6,0]  [6,1]  [6,2]  [6,3]  [6,4]  [6,5]  
[7,0]  [7,1]  [7,2]  [7,3]  [7,4]  [7,5]  
[8,0]  [8,1]  [8,2]  [8,3]  [8,4]  [8,5]  
}

!Получение индексов масива через функцию ARRPOS

$Поиск='[2,5]'

i1=ARRPOS('$ДвумерныйМассив',$Поиск)/i2_max
i2=ARRPOS('$ДвумерныйМассив',$Поиск) mod i2_max

if ARRPOS('$ДвумерныйМассив',$Поиск)<>-1 : *Nl $Поиск+'=[<<i1>>,<<i2>>]' else *Nl 'Элемент не найден'
!{Результат 
[2,5]=[2,5]
}


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

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