Немного предыстории, недавно я решил перейти на JASS окончательно и бесповоротно, потому что когда начинаешь делать красивую анимацию на триггерах и даммиках, образуется такая течь, что играть становится невозможно
Итак, пара вопросов по JASS:
  1. Передача аргументов в функции идет по ссылке или по значению?
  2. Если по значению, то как передать по ссылке?
  3. Если локальная переменная возвращается из функции, то как ее обнулять (допустим возвращается тип unit)?
  4. Есть ли возможность передачи шаблонных аргументов в функцию?
  5. Не нашел информации по работе с массивами на JASS (только на cJass, Zinс), ссылочку пожалуйста. Интересует объявление\определение\ обращение\передача в функцию (по ссылке).
  6. Есть ли возможность "typedef"? "class"? массив ссылок?
  1. Документация, которая могла бы объяснить что делают некоторые нативки (на английском тоже нормально), пока приходится писать на гуи код, потом ковертировать, а потом искать аналоги нативок для BJ функций. (Двойная работа) Возможно есть способ не писать код дважды?
P.S. Честно все искал, но вот эти вопросы остались по-прежнему незакрыты. Спасибо за внимание.

Принятый ответ

всегда по ссылке для handle-типов, всегда по значению для остальных
изменить это невозможно
никак, использовать глобалку, куда сохранять локалку перед нулением
нет, нету
ну или аналоги всего этого есть в продвинутых редакторах, не знаю, пусть те, кто ими пользуются, скажут
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
16
5 лет назад
2
всегда по ссылке для handle-типов, всегда по значению для остальных
изменить это невозможно
никак, использовать глобалку, куда сохранять локалку перед нулением
нет, нету
ну или аналоги всего этого есть в продвинутых редакторах, не знаю, пусть те, кто ими пользуются, скажут
Принятый ответ
0
26
5 лет назад
0
Если локальная переменная возвращается из функции, то как ее обнулять (допустим возвращается тип unit)?
никак, и не нужно
Не нашел информации по работе с массивами на JASS (только на cJass, Zing), ссылочку пожалуйста. Интересует объявление\определение\ обращение\передача в функцию (по ссылке).
тебе достаточно дописать
real array some_numbers[5]
что уже объявит массив размером 5
на vjass можно делать двойной массив, что уменьшит максимальное число ячеек в массиве (изначально около ~8100 на 1.26а)
real array some_numbers[5][5]
если используешь cjass можно просто писать
real some_numbers[5]

примерный аналог классов это структуры (struct) из vjass, их вроде хотели добавить нативно в последних версиях варкрафта
Документация, которая могла бы объяснить что делают некоторые нативки (на английском тоже нормально), пока приходится писать на гуи код, потом ковертировать, а потом искать аналоги нативок для BJ функций. (Двойная работа) Возможно есть способ не писать код дважды?
например? многие функции говорят сами за себя, тем более что в редакторе есть список всех функций и констант, плюс можно раскрывать содержимое бж функций зажав ctrl и кликнув по ней
0
17
5 лет назад
Отредактирован GetLocalPlayer
0
никак, и не нужно
Нужно.
Hate:
что уже объявит массив размером 5
В Jass размерность массива не задается, этого нет в его синтаксисе. Используется в vJass и Zinc и только для объяления типа-массива или двумерного массива. То есть запись
real array some_numbers[5]
будет переварена парсером но сама по себе не имеет смысла.
0
32
5 лет назад
0
Нативок очень много, прям вам каждая непонятна?
0
33
5 лет назад
0
их вроде хотели добавить нативно в последних версиях варкрафта
вроде ещё не добавили
0
8
5 лет назад
Отредактирован pAxsIs
0
Итак объединю все ответы:
  1. Передача происходит по ссылке
  2. см. в п.1.
  3. Обнулять можно только до возвращения, а возвращать лучше через глобальную переменную
  4. Такой возможности - нет
  5. В обычном JASS объявление:
	local real array nameArray
Определение не требуется, поэтому Обращение:
	set nameArray[0] = 1.0
Передача в функцию просто по имени? Происходит передача по ссылке для Handle, остальные по значению.
  1. Возможно есть структуры в vJASS (структура по сути от класса ничем не отличается, кроме public -> private).
  2. Вот пример, который я не смог понять, для меня это не самоговорящее название:
	call AnyUnitEvent( gg_trg_TrigName, EVENT_PLAYER_HERO_SKILL )
Могу кучу версий подобрать что будет означать этот ивент. Поэтому некоторые нативки довольно непонятны.

Еще один доп вопрос: Разве vJASS и JASS не одно и тоже? Раньше когда читал так и думал.
Правильно все ответы разобрал?
0
26
5 лет назад
0
Нужно.
KillUnit(GetTriggerUnit())
что ты здесь собрался обнулять?
0
8
5 лет назад
Отредактирован pAxsIs
0
Hate:
Нужно.
KillUnit(GetTriggerUnit())
что ты здесь собрался обнулять?
Я говорил про такой пример:
function foo takes nothing returns string
	local string s = "This is a string"
	
	return s
endfunction
Вместо string можно любой другой тип данных подставить для примера
2
21
5 лет назад
Отредактирован Raised
2
Нативки возвращают ссылку на handle, причастный к ивенту. Переменные типа handle просто хранят ссылку на объект, ну и сами хранятся в памяти.
В случае с глобальными переменными в обнулении нет особого смысла ибо значение переменной просто перезаписывается, но с локальными переменными, наследующими тип handle все не так радужно ибо вопреки ожиданиям, выделенная под них память не очищается после выполнения функции, потому их нужно обнулять вручную.
Глобалки же можно (и нужно?) использовать в качестве эдакого контейнера для хранения-передачи значений, обрабатываемых за одну итерацию.
3.Если локальная переменная возвращается из функции, то как ее обнулять
Функция возвращает не переменную, а ссылку на игровой объект. А эта ссылка записывается в переменную. Проверь. Обнуление переменной ведь не удаляет юнита. Но сама переменная (ссылка) тоже занимает место в памяти.
обнулять так:
     set var = null
Возможно есть способ не писать код дважды?
JassHelper? Встроен в последние сборки нестандартных редакторов как наших, так и с Hive.
0
8
5 лет назад
Отредактирован pAxsIs
0
Raised:
JassHelper? Встроен в последние сборки нестандартных редакторов как наших, так и с Hive.
Не судите строго, я в JASS недавно (также как и недавно ушел со стандартного редактора карт на JNGP), но пока увидел работу JassHelper только в проверке на ошибки в коде, во время сохранения (хотя часто указывает не на то место).
Поскольку пишу под версию 1.24e, то выбрал такой JNGP, это к вопросу о работе моего JassHelper. Пробовал новее версии, но потом карту открыть невозможно.
По поводу vJass и JASS сложилось впечатление, что это одно и тоже, потому что во многих местах видел код vJass не использующий никаких реализаций ООП. Сейчас понял примерную разницу.
По поводу массива почему такой интерес, хотел бы реализовать что-то такое (напишу на С++, надеюсь понятно будет):
void Foo (vector<int> &v)
{
	for (auto e : v) {
		cout << e << endl;
	}
}
Суть в том, что может передатся любой массив определенного типа в функцию, а функция уже сделает определенные действия используя этот массив.
0
21
5 лет назад
0
Тьфу. TESH. Одно из двух. Давно редактор не открывал.
1
17
5 лет назад
Отредактирован GetLocalPlayer
1
Hate:
KillUnit(GetTriggerUnit())
что ты здесь собрался обнулять?
При чем тут это если речь о локальных переменных?
pAxsIs:
Суть в том, что может передатся любой массив определенного типа в функцию, а функция уже сделает определенные действия используя этот массив.
В обычном Jass массивы невозможно передать в функцию. В vJass можно
Подробнее тут или тут, что больше нравится.
4
28
5 лет назад
Отредактирован PT153
4
1. В JASS только 6 типов (nothing не считаем), все они передаются по значению. handle, string и code -- ссылочные типы, а это значит, что после создания объекта возвращается ссылка на него, и работа ведётся только с ней. Так как переменная ссылочного типа содержит лишь ссылку, при вызове функции значение передаваемой переменной (то есть ссылка) копируется в аргумент функции (поэтому передача по значению. При передаче по ссылке создаётся ссылка на передаваемую переменную и ничего не копируется). Понятное дело, никакой новый объект при этом не создаётся.
string нельзя изменить, при конкатенации создаётся новая строка в специальном месте и возвращается ссылка на неё (или берётся ссылка на получившуюся строку, если она была уже когда-то создана).
Больше о string.
2. Никак.
3. Никак, но обнулять нужно. Это обещали исправить в будущих патчах.
Обнулять нужно только тип handle и его наследников (string не наследник handle!).
Аргументы функции обнулять не нужно.
4. Что значит шаблонные? Значений по умолчанию у аргументов не может быть.
5. В JASS нельзя передавать массивы как аргументы, размер их фиксированный.
Нельзя создать массив типа code.
6. Структуры vJass, но они местами забагованы.
7. Все нативки есть в common.j и common.ai.

GetLocalPlayer уже скинул ссылку на мануал vJass, советую прочитать. Также советую прочитать самые последние ченжлоги упомянутые там.

Обновил немного пост, забыл о code.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.