Добавлен , опубликован

vJass

Содержание:

Содержание главы:

Двумерные массивы

vJass позволяет вам объявлять двумерные массивы.
globals
    integer array test[8][10]
endglobals
Обратите внимание, что это лишь имитация двумерного массива, основанная на использовании обычного Jass-массива со смещением. Это означает, что вы ограничены в размерности, которую можете задать двумерному массиву, поскольку массивы в Jass ограничены размером в 8192 ячейки. Так например, в примере выше, мы объявили двумерный массив test, которому JassHelper резервирует 8*10 ячеек обычного Jass-массива, в который развертывается.

Тип-массив

Прим. пер.: в оригинале это дело именуется "dynamic arrays", что может ввести в заблуждение, посему я посмел выбрать иное определение.
vJass позволяет объявлять особую разновидность массива, которая может быть использована в качестве нового типа данных. Это дает возможность использовать массивы подобно обычным переменным - передавать их в качестве аргумента функции, указывать как возвращаемое значение и т.д.
При объявления типа-массива вы должны явно указывать его размерность.
Тип-массив развертывается в обычный Jass-массив, что накладывает ограничение на количество экземпляров одного типа. То есть, если вы объявили тип-массив размерностью 100, вы сможете создать только 81 экземпляр этого типа. Если вы попытаетесь создать экземпляр типа-массива, превысив максимальное число экземпляров этого типа, конструктор вернет значение 0, а в игре будет выведено предупреждение на экран.
В целом, поведение типа-массива схоже с поведением структур. Для создания экземпляра вы так же должны обратиться к методу create, а более ненужный экземпляр необходимо уничтожать вызовом метода destroy.
Обращение к ячейке типа-массива происходит посредством оператора [] подобно обычному массиву.
Синтаксис объявление типа массива следующий
type <ИмяТипа> extends <базовыйТип> array[<размер>]
где <размер> - целоче число или глобальная константа.
Продемонстрируем вышесказанное на простом примере
type MyArray extends integer array[8]

function GetArrayInstance takes nothing returns MyArray
    local MyArray tmp = MyArray.create()
    local integer i = 0
    loop
         exitwhen i == MyArray.size // Размер массива
         set tmp[i] = i
         set i = i + 1
    endloop
    return tmp
endfunction

function Test takes nothing returns nothing
    local MyArray tmp = GetArrayInstance()
    local integer i=0
    loop
        exitwhen i == MyArray.size
        call BJDebugMsg(I2S(tmp[i]))
        set i = i + 1
    endloop
    call tmp.destroy()
endfunction
Пример выше так же демонстрирует атрибут size. Это атрибут присущий любому типу-массиву и позволяет узнать размерность, с которой этот тип был объявлен.
Вы так так же можете объявлять тип-массив от любого пользовательского типа - структура, интерфейс, другой тип-массив. В случае объявления типа-массива от другого типа-массива, мы получаем объект с поведением многомерного массива. Это позволяет реализовать, например, матрицы
type MyArray extends integer array[3]
type Matrix extends MyArray array[3]

function GetMatrix takes nothing returns Matrix
    local Matrix tmp = Matrix.create()
    local integer i = 0
    local integer j
    loop
        exitwhen i == Matrix.size
        set tmp[i] = MyArray.create()
        set j = 0
        loop
            exitwhen j == MyArray.size
            set tmp[i][j] = j*i
            set j = j + 1
        endloop
        set i = i + 1
     endloop
    return tmp
endfunction

function Test takes nothing returns nothing
    local Matrix mat = GetMatrix()
    local integer i = 0
    local integer j
    local string s
    loop
        exitwhen i == mat.size
        set j = 0
        set s = ""
        loop
            exitwhen j == mat[i].size
            set s = s + I2S(mat[i][j]) + " "
            set j = j + 1
        endloop
        call BJDebugMsg(s)
        set i = i + 1
    endloop
    call mat.destroy()
endfunction
Аргументы структуры так же могут иметь тип-массив

type MyArray extends integer array [20]

struct stack
   private MyArray arr
    /*
        Прочий код...
    */
endstruct

Массив структуры

Порой у вас может появиться желание заиметь готовый глобальный массив типа структуры. Возможно, необходим набор уже готовых экземпляров какой-то структуры, без постоянного вызова конструктора и деструктора. Массив структуры, это небольшое синтаксическое усиление, что избавит от необходимости постоянного вызова конструктора
struct playerdata extends array // Синтаксис объявления массива структуры
    integer a
    integer b
    integer c
endstruct

function init takes nothing returns nothing
    local playerdata pd

    set playerdata[3].a=12
    set playerdata[3].b=34 
    set playerdata[3].c=500

    set pd=playerdata[4]
    set pd.a=17  
    set pd.b=111 
    set pd.c=501
endfunction

function updatePlayerStuff takes player p returns nothing
    // Какая-то случайная функция
    local integer i=GetPlayerId(p)
    set playerdata[i].a=playerdata[i].b
endfunction
Пара замечаний при работе с массивом структуры:
  • Вы не можете инициализировать атрибуты массива структуры (им будут автоматически установлены значения 0 или null)
  • Вы не можете определить деструктор (это было бы бессмысленно)
  • Вы не можете вызвать allocate и destroy методы
  • Массив структуры не может иметь атрибуты-массивы

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
3 года назад
Отредактирован PT153
0
Массив структуры
Я бы это назвал "структура-массив". Ибо массив структуры это просто MyStruct array MyStructArray.

Почему ничего не сказано про .size, .height и .width у двумерного массива?
0
17
3 года назад
0
Почему ничего не сказано про .size, .height и .width у двумерного массива?
Из статьи:
Пример выше так же демонстрирует атрибут size. Это атрибут присущий любому типу-массиву и позволяет узнать размерность, с которой этот тип был объявлен.
За остальные два не поясню.
0
28
3 года назад
0
Из статьи:
Это имеет отношение к типу-массиву, но не к двумерному. Я же спрашивал как раз про двумерный массив.

Как я и написал, лучше перенести двумерный массив в Расширенную индексацию. Там хотя бы пример использования есть. И заодно добавить, что width * height не может быть больше общего лимита в 408 000 (это также есть в оригинале, но там ошибка, Вексориан забыл дописать один ноль).
0
17
3 года назад
Отредактирован GetLocalPlayer
0
Это имеет отношение к типу-массиву, но не к двумерному. Я же спрашивал как раз про двумерный массив.
Об этом написано в расширенной индексации, но да, стоило бы добавить тут.
В любом случае, как я уже объяснял 2 года назад, с одной стороны, система сайта ставит палки в колеса, поскольку любое исправление статьи должно быть проверено модератором, что очень сильно усложняет работу. С другой стороны, эта статья была убрана вскоре после публикации. Статья была опубликована модератором, а вскоре снята с публикации другим модератором. Кто и почему опубликовал статью снова, передо мной никто не отчитывался, ее тут по идеи быть не должно. Администрация ресурса не заинтересована в моей работе.
0
28
3 года назад
0
Лады, в общем, если дойдут руки, сам исправлю. Пока некритично. Всё равно лучше всё почитать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.