Germany | Finland | Saint Petersburg | Drive

Многомерные массивы в QPILE

Опубликовано в QPILE

В QPILE нет понятия "массив". Тем более нет многомерных массивов. Однако в некоторых случаях необходимы операции с объектами матричной структуры. Решение проблемы на первый взгляд неочевидно.

Самый простой и наглядный способ - в использовании ассоциативных массивов. Вот решение для трехмерного массива:

FUNC create_array()
   result = create_map()
END FUNC

FUNC set_array(array,x,y,z,value) 
   result = set_value(array,"~"&x&"~"&y&"~"&z ,value)
END FUNC
FUNC get_array(array,x,y,z) 
   result = get_value(array,"~"&x&"~"&y&"~"&z)
END FUNC

Функция create_array() просто создает ассоциативный массив. Функция эта создана исключительно как дань практике пристойного программирования Cool. Заполнение массива идет функцией set_array(). Она добавляет в ассоциативный массив array значение value с уникальным ключом, составленным из трех индексов x,y и z.  Соответственно get_array() возвращает значение элемента ассоциативного массива с ключом, вычисленным из индексов по тем же правилам.

Для M4 просто загляденье получается:

define(create_array,""))
define(set_array,set_value($1,"~"&$2&"~"&$3&"~"&z ,$4))
define(get_array,get_value($1,"~"&$2&"~"&$3&"~"&$4))

 


Особенности:

  • массивы динамические - нет ограничений на размерность
  • заполнение элементов массива может идти в произвольном порядке
  • значениями массива могут быть любые типы, определённые в QPILE - числа, строки, коллекции, другие ассоциативные массивы 
  • незаполненные  элементы всегда проинициализированы пустой строкой
  • относительно низкая  производительность - не стоит использовать очень большие объёмы данных
  • произвольная размерность массивов

 См. также Динамические многомерные массивы в Lua.

Добавить комментарий