XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
[cJass] 2D массивы by FB.
Требования:
WarCraft III от версии 1.24b
JNGP самой последней версии.
cJass самой последней версии.

Эта система предназначена для лёгкого и быстрого создания лёгких двумерных массивов.

Предназначена для простых систем, для которых использовать XAT - муторно, HASH - тормознуто, SCV - поздновато. Позволяет быстро подставить переменную любого типа (инициализированного при помощи дефайна) на две переменных (двумерные координаты x и y). Для этого используются стандартные одномерные массивы вк3. Это значит, что максимальный размер массива равен x*y <= 8192

Т.е., вы можете создать массив 90*91, можете 8192*1, 4096*2 и т.д. Главное, чтобы произведение не было больше 8192, хотя если так и будет, система просто выдаст ошибку.

Сейчас вы спросите, для чего это, что ты за мудозвон и баянист и т.д.. Объясню. Эта система - быстрая и лёгкая, позволяет аттачить любой тип переменной без килобайт ненужного кода на два (или один, если одна из координат массива равна единице) интегера. Да, для совсем уж сложных систем можно юзать XAT/HASH+struct. Но это - ненужная сложность для маленьких системок. И уж тут моим двумерным массивам нет равных. Просто взгляните на карту-пример, чтобы понять это. Хоть там и есть много ненужного кода, вы разберётесь.

Перейдём к следующей части. Использование. Из карты просто возьмите этот кусок кода:

Код:
include "cj_types.j"
include "cj_print.j"
constant int FB2D_MAX_SIZE = 0x02000
constant int FB2D_MIN_SIZE = 0x01


define <fb2Darray> (FBtype, FBname, FBprivate, FBsx, FBsy) = {
    FBprivate FBtype array fb2D##FBname //Globals/Endglobals. Mwohaha, respect VanDamn, respect Adic.
    
    
    FBprivate int FBname##Detecter(int ix, int iy) {
        if ix > FBsx { printf("^v: critical error! X parameter ^i is bigger then declared ^i!",FBname,ix,FBsx) } 
        if iy > FBsy { printf("^v: critical error! Y parameter ^i is bigger then declared ^i!",FBname,iy,FBsy) }
        if ix < FB2D_MIN_SIZE { printf("^v: critical error! X parameter ^i is lesser then 1!",FBname,ix) }
        if iy < FB2D_MIN_SIZE { printf("^v: critical error! Y parameter ^i is lesser then 1!",FBname,iy) }
        if ix*iy > FB2D_MAX_SIZE { printf("^v: fatal error!",FBname) }
        return FBsy*ix+iy
    }
    FBprivate void FBname##Store(FBtype ixy, int ix, int iy) {
        fb2D##FBname[FBname##Detecter(ix, iy)] = ixy
    }
    FBprivate FBtype FBname##Get(int ix, int iy) {
        return fb2D##FBname[FBname##Detecter(ix, iy)]
    }
}


И это вся система =) Её можно ещё больше упростить, подогнать под себя, но это уже упирается только в ваше желание.

Инициализация не менее проста.
Код:
fb2Darray(*тип переменной, например, integer, или hashtable*, *название, по которому вы будете называть массив в дальнейшем*, *тип приватности массива, например private. Можно и просто оставить без заполнения*, *макс. размер x*, макс. размер y*)


Такой дефайн можете прописать сколько угодно раз внутри вашей library, scope или просто так. В последнем случае тип приватности ставить нельзя, оставьте там пробел.

Дальнейшее использование проще ещё в три раза.
Код:
*имя массива*Store(*ваша переменная*, integer x, integer y) //запоминает вашу переменную в массив.
*имя массива*Get(integer x, integer y) //возвращает вашу переменную из массива.


Более подробно вы можете посмотреть в карте-примере. Удачного использования =)

FREEZE_ball, 2009.
For XGM.ru
Прикрепленные файлы
Тип файла: w3x 2D arrays.w3x (15.6 Кбайт, 23 просмотров )
Старый 15.09.2009, 20:51
ScorpioT1000
Работаем
online
Опыт: отключен
я не пойму, зачем это нужно.. массив динамически реаллочить нельзя(у тебя). Статики и так уже давно есть у jngp
Старый 15.09.2009, 20:55
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
ScorpioT1000, вот уж не знаю, мне было очень удобно её использовать.

Насчёт статиков - они мне не нравятся. Хоть бы example скачал для приличия =)
Старый 15.09.2009, 21:07
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
боян бо вещий ибо в vJass векс такое уже сделал и намного удобнее :3
Старый 15.09.2009, 22:24
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Ох уж критики ^^ . Ладно, забудьте, каждому своё.

Но хоть скачали бы тестовую карту, там красивые эффекты есть *THUMBS UP*
Старый 15.09.2009, 22:55
adic3x

offline
Опыт: 108,439
Активность:
логика автора является для меня непостижимой, от сабжа толку 0
Старый 15.09.2009, 23:01
ZeToX2007

offline
Опыт: 7,009
Активность:
-1, это не нужно... тем более это уже есть.

По поводу Хештаблиц, они достаточно быстрые... а самое быстрое это ZeDCS.
Старый 16.09.2009, 01:43
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
^ реклама
Старый 16.09.2009, 01:47
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Van Damm, это ещё один способ сохранения переменных, я бы сказал так.

этот способ называется "через жопу" - прим. Адик

Отредактировано ADOLF, 16.09.2009 в 10:57.
Старый 16.09.2009, 07:29
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 16:43.