|
|
|
|
[JASS] Альтернативный урок 3. Функции
|
|
dredsss | Дата: Понедельник, 01 Апреля 2013, 20:39:55 | Сообщение # 1 |
7 уровень
Группа: Проверенные
Сообщений: 403
Награды: 1
Репутация: 50
Блокировки:
| Уроки Дуоса пишет Тузик. Ему и быть он-лайн. Цитата Ждите в субботу-воскресенье урок о функциях. Мы ждали очень. Но обещанного 3 года ждут. Жаль, то Дуос не исправился. Число не выполненных обещаний идет на десятки. Придется запилить свой урок. Непонятный конченый раковый, но другого не дают.Добавлено (01 Апреля 2013, 20:39:55) --------------------------------------------- [Jass] Урок 3. Функции. Плохой урок сейчас вместо хорошего никогда
ФУНКЦИИ Встроенные функции( или нативки) - функции, которые считаются изначально существующими. Они могут быть встроенны в движок игры, а могут предоставляться какой-либо надстройкой Jass, например Blizzard.j . Вызываются они так же как и ползовательские функции. В среде варкрафтеров нативками принято называть только функции, встроенные в движок вара, а те, что в Blizzard.j, называть "БЭЖЭ".
Пользовательская функция в Jass(дальше просто функция) - кусок программы, получивший имя, который можно выполнять в любом месте программы просто указав его имя. В мире различают процедуры и функции, но джассеры не различают. Функции раздляют программу на логичные блоки; позволяют каждому блоку использовать свой набор переменных, видимых только внутри блока и не путающихся под ногами в остальных частях прг.
Строение функции: function <ИМЯ ФУНКЦИИ> takes <ФОРМАЛЬНЫЕ ПАРАМЕТРЫ ЧЕРЕЗ ЗАПЯТУЮ> returns <ТИП ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ> [ОБЪЯВЛЕНИЯ ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ] [ДЕЙСТВИЯ] endfunction Треугольные и квадратные скобки не часть синтаксиса. Функция оформляется ключевыми словами function, takes, returns и endfunction, которые ни для чего другого не используются. <ИМЯ ФУНКЦИИ> - несколько символов из набора a..zA..Z0..9_, по желанию кодера. Имя должно начинаться с буквы и не должно совпадать с существующими именами и ключевыми словами. <ФОРМАЛЬНЫЕ ПАРАМЕТРЫ ЧЕРЕЗ ЗАПЯТУЮ> - несколько переменных, в которые записываются значения при вызове функции. Один формальный параметр: <ТИП ПЕРЕМЕННОЙ> <ИМЯ ПЕРЕМЕННОЙ>. Формальные параметры ничем не отличаются от локальных переменных, кроме того, как они получают начальное значение. Если формальные параметры не требуются, то вместо них ставится ключевое слово Nothing. Функция может передать одно значение в то место, где ее вызвали. <ТИП ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ> - тип этого значения. Если ничего передать не нужно, то ставится ключевое слово Nothing. [ОБЪЯВЛЕНИЯ ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ] - (необязательная часть) объявления локальных переменных. Имена этих переменных существуют только внутри данной функции. В других функциях можно создавать переменные с такими же именами, и это быдут совсем другие переменные. Значения локальных переменных сохраняются пока выполняется код внутри нее. Если одну и ту же функцию одновременно вызвали в разных потоках, то в каждом потоке будут разные наборы значений. Если функция вызвала себя же (так можно), то после вызова переменные сохранятся, а в рекурсивном вызове будет свой набор переменных. [ДЕЙСТВИЯ] - (необязательная часть) любые строки программы, кроме объявлений переменных и функций. Действия и объявления локалок нельзя смешивать. Сначала все объявления локалок, потом все остальное. Вместе [ОБЪЯВЛЕНИЯ ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ] и [ДЕЙСТВИЯ] называются телом функции.
Выход из функции Если выполнилась самая последняя строчка в теле функции, и функция не должна возвращать значение, то работа программы продолжится в том месте, где функцию вызвали. Завершать так функцию, возвращающую значение, нельзя. Чтобы завершить работу функции в любом месте внутри [ДЕЙСТВИЯ] можно вставлять команду: return [<ВЫРАЖЕНИЕ, ЗНАЧЕНИЕ КОТОРОГО ВЕРНЕТ ФУНКЦИЯ>] Если функция не возвращает значение, то ставить return непосредственно выше endfunction не обязательно.
Вызов функции Есть несколько способов вызвать функцию. 1. Использовать команду: call <ИМЯ ФУНКЦИИ>(<ВЫРАЖЕНИЯ ЧЕРЕЗ ЗАПЯТУЮ>) Круглые скобки - часть синтаксиса. Количество выражений, а также типы получающихся значений должны совпадать с формальными параметрами функции. Действие команды. Выражения вычисляются; получившиеся значения записываются в формальные параметры функции; выполняется тело функции; если функция вернула значение, то оно похеривается. Все. Новых потоков не создается. 2. Вставить конструкцию <ИМЯ ФУНКЦИИ>(<ВЫРАЖЕНИЯ ЧЕРЕЗ ЗАПЯТУЮ>) на месте какого-то выражения/значения/переменной. Например: local integer lA set lA = 1+2+func(28,11)+4 Функция обязательна должна вернуть значение, которое и будет использовано. Новых потоков не создается. Функция должна быть определена выше того места, где вызывается, или быть нативной. 3. Явно создать новый поток одной из двух команд: Call StartThread(<ИМЯ ФУНКЦИИ>) Только для ИИ. В новом потоке выполняется указанная функция без аргументов и возвращаемого значения. Функция должна быть определена выше того места, где вызывается, или быть нативной. call ExecuteFunc(<ВЫРАЖЕНИЕ>) Только для war3map.j. <ВЫРАЖЕНИЕ> - выражение, типа string. Значение выражения обязано совпасть с именем одной из пользовательских функций. Причем функция может быть определена и выше и ниже места вызова. С помощью этой команды можно во время игры получить из чата имя функции и выполнить ее. Функция не должна принимать параметров. Выполняется в новом потоке; текущий не прерывается. 4. Задать функцию как действие какого-либо триггера. Должно быть рассмотрено в теме триггеров. 5. Указать функцию в качестве фильтра. Тоже лучше рассмотреть в другой теме. 6. Программа начинает выполняться в одном потоке с обязательной функции main. Опять же, должен быть урок по файлам карты.
Примеры. Функция, которая ничего не делает, ничего не возвращает и не принимает аргументов: Код function DoNothing takes nothing returns nothing endfunction Функция, которая убивает все живое в радиусе 1000.0 от заданной точки и возвращающая количество убитых: Код function postKinga takes real rX, real rY returns integer local group gA = CreateGroup() local integer lA = 0 local unit uA call GroupEnumUnitsInRange(gA,rX,rY,1000.0,null) loop set uA = FirstOfGroup(gA) exitwhen uA == null if IsUnitType(uA,UNIT_TYPE_DEAD) or IsUnitType(uA,UNIT_TYPE_STRUCTURE) or IsUnitType(uA,UNIT_TYPE_SUMMONED) or IsUnitType(uA,UNIT_TYPE_UNDEAD) or IsUnitType(uA,UNIT_TYPE_MECHANICAL) then else set lA = lA+1 call KillUnit(uA) endif call GroupRemoveUnit(gA,uA) endloop call DestroyGroup(gA) set gA = null return lA endfunction
|
|
|
|
Ty3uK | Дата: Понедельник, 01 Апреля 2013, 21:19:31 | Сообщение # 2 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Цитата (dredsss) а могут предоставляться какой-либо надстройкой Jass, например Blizzard.j Мне казалось, нативки можно подгружать из самописных dll при помощи RtC, а близзард.ж - обычные юзерфунки.
|
|
|
|
dredsss | Дата: Понедельник, 01 Апреля 2013, 21:38:58 | Сообщение # 3 |
7 уровень
Группа: Проверенные
Сообщений: 403
Награды: 1
Репутация: 50
Блокировки:
| Ty3uK, превосходный вопрос. Нативный - присущий исходной аппаратной или программной среде. Если мы нос в близзард.жо не суем, то все бэжэ для нас нативки. А если хоть что-то поменяли, то юзерфунки. Подгружаются собственные нативки или не нативки - вопрос скользкий. И так и так можно сказать.
|
|
|
|
Ty3uK | Дата: Понедельник, 01 Апреля 2013, 21:40:03 | Сообщение # 4 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| dredsss, да, я согласен. Но я все же склонен к более официальному варианту, как-то оно привычнее, что ли.
|
|
|
|
dredsss | Дата: Понедельник, 01 Апреля 2013, 21:48:43 | Сообщение # 5 |
7 уровень
Группа: Проверенные
Сообщений: 403
Награды: 1
Репутация: 50
Блокировки:
| У слова native есть не только технический перевод, но и буквальный. И переводится оно как родной. Родные для вара твои подгружаемые функции? Не мне, но некоторым режет слух. Пока помнишь правильные значения терминов - искажай как хочешь, право имеешь.
|
|
|
|
Ty3uK | Дата: Понедельник, 01 Апреля 2013, 21:52:14 | Сообщение # 6 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| dredsss, оно-то понятно, что имеется еще и прямое значение, но если рассматривать этот вопрос с точки зрения оригинального кода, то мы банально расширяем функционал уже написанных функций (на Си, или плюсах, не помню уже) своими функциями, которые игрой воспринимаются точно так же, как и родные из Game.dll. Или я не прав? С технической точки зрения.
|
|
|
|
dredsss | Дата: Понедельник, 01 Апреля 2013, 22:03:48 | Сообщение # 7 |
7 уровень
Группа: Проверенные
Сообщений: 403
Награды: 1
Репутация: 50
Блокировки:
| Поэтому Цитата (dredsss) И так и так можно сказать
|
|
|
|
Ty3uK | Дата: Понедельник, 01 Апреля 2013, 22:04:16 | Сообщение # 8 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Консенсус найден.
|
|
|
|
Duosora | Дата: Вторник, 02 Апреля 2013, 00:04:48 | Сообщение # 9 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Уроки Дуоса пишет в основном Дуос.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
H_A_PK | Дата: Вторник, 02 Апреля 2013, 00:08:23 | Сообщение # 10 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| кто такой этот дуос :О,не знаю никаких дуосов, наш учитель Дуосора Добавлено (02 Апреля 2013, 00:08:23) --------------------------------------------- самсунг дуос знаю
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
SirNikolas | Дата: Среда, 03 Апреля 2013, 11:53:21 | Сообщение # 11 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Цитата (dredsss) В мире различают процедуры и функции, но джассеры не различают. Какие процедуры? Цитата (dredsss) <ИМЯ ФУНКЦИИ> - несколько символов из набора a..zA..Z0..9_, по желанию кодера. Имя должно начинаться с буквы И не должно заканчиваться символом подчеркивания.Цитата (dredsss) ExecuteFunc Цитата (dredsss) Выполняется в новом потоке; текущий не прерывается. Прерывается же.
Считаю, что в целом урок удался.
|
|
|
|
BlackFoxi | Дата: Среда, 03 Апреля 2013, 16:50:39 | Сообщение # 12 |
2 уровень
Группа: Пользователи
Сообщений: 23
Награды: 0
Репутация: 10
Блокировки:
| Цитата (SirNikolas) Какие процедуры? ГОСТ 28397-89 Цитата (SirNikolas) Прерывается же. Нет. При исследовании этой команды необходимо помнить, что на 1 игрока отводится максимум 6 потоков, включая main.
|
|
|
|
SirNikolas | Дата: Среда, 03 Апреля 2013, 17:57:03 | Сообщение # 13 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Код callback onInit() { ExecuteFunc("test0");//Миллион итераций printf("main"); }
void test0() { for (int i = 0; i < 1000; i++) { ExecuteFunc("test1"); } printf("test0"); }
void test1() { for (int i = 0; i < 1000; i++) { } printf("test1"); } Выводит тысячу "test1", потом "test0" и "main".
|
|
|
|
H_A_PK | Дата: Среда, 03 Апреля 2013, 18:04:57 | Сообщение # 14 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| Цитата (SirNikolas) Выводит тысячу "test1", потом "test0" и "main". т.е. поток всё таки 1?
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
BlackFoxi | Дата: Среда, 03 Апреля 2013, 18:56:44 | Сообщение # 15 |
2 уровень
Группа: Пользователи
Сообщений: 23
Награды: 0
Репутация: 10
Блокировки:
| SirNikolas прав. Поток не создается.
|
|
|
|
Bru | Дата: Среда, 03 Апреля 2013, 20:18:58 | Сообщение # 16 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Вынужден выпилить топан из Школы.
|
|
|
|
BlackFoxi | Дата: Среда, 03 Апреля 2013, 22:07:42 | Сообщение # 17 |
2 уровень
Группа: Пользователи
Сообщений: 23
Награды: 0
Репутация: 10
Блокировки:
| А я не так выпиливаю.
|
|
|
|
Ty3uK | Дата: Среда, 03 Апреля 2013, 22:33:58 | Сообщение # 18 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Цитата (BlackFoxi) А я не так выпиливаю. Сразу вместе со всем сайтом?
|
|
|
|
vov68 | Дата: Четверг, 04 Апреля 2013, 15:13:33 | Сообщение # 19 |
10 уровень
Группа: Проверенные
Сообщений: 1329
Награды: 3
Блокировки:
| есть понятие "подпрограмма", есть понятие "функция" вопрос: в чём разница?
Зачем делать для других новые карты... ... лучше устроить коту божественный почесон. :)
|
|
|
|
BlackFoxi | Дата: Четверг, 04 Апреля 2013, 17:11:44 | Сообщение # 20 |
2 уровень
Группа: Пользователи
Сообщений: 23
Награды: 0
Репутация: 10
Блокировки:
| Подпрограмма - это программа, являющаяся частью другой программы. Функция - подпрограмма, которой присвоено имя, которую можно запускать по этому имени, в которой могут объявляться локальные объекты, в которую при запуске могут передаваться параметры, влияющие на ее работу и которая, по завершении, вырабатывает одно значение, связанное с функцией.
|
|
|
|
Duosora | Дата: Пятница, 05 Апреля 2013, 18:42:21 | Сообщение # 21 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Цитата (dredsss) В мире различают процедуры и функции, но джассеры не различают. What? Процедуры ничего не могут возвращать в отличие от функций. Цитата (dredsss) if IsUnitType(uA,UNIT_TYPE_DEAD) or IsUnitType(uA,UNIT_TYPE_STRUCTURE) or IsUnitType(uA,UNIT_TYPE_SUMMONED) or IsUnitType(uA,UNIT_TYPE_UNDEAD) or IsUnitType(uA,UNIT_TYPE_MECHANICAL) then else set lA = lA+1 call KillUnit(uA) endif Быдлокодинг. Код if not (IsUnitType(uA,UNIT_TYPE_DEAD) or IsUnitType(uA,UNIT_TYPE_STRUCTURE) or IsUnitType(uA,UNIT_TYPE_SUMMONED) or IsUnitType(uA,UNIT_TYPE_UNDEAD) or IsUnitType(uA,UNIT_TYPE_MECHANICAL)) then set lA = lA+1 call KillUnit(uA) endif
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
MrPetronix | Дата: Суббота, 06 Апреля 2013, 17:48:09 | Сообщение # 22 |
1 уровень
Группа: Пользователи
Сообщений: 4
Награды: 0
Репутация: 12
Блокировки:
| сягласян с dress и backfoxi
Ты крутишься вокруг мира, а не он вокруг тебя.
|
|
|
|
BlackFox | Дата: Вторник, 09 Апреля 2013, 01:57:02 | Сообщение # 23 |
3 уровень
Группа: Проверенные
Сообщений: 52
Награды: 0
Репутация: 25
Блокировки:
| Прекрасный урок.
SirNikolas падёт в неравном бою с брутфорсом, Alice.
|
|
|
|
Рональд | Дата: Вторник, 09 Апреля 2013, 17:24:56 | Сообщение # 24 |
1 уровень
Группа: Пользователи
Сообщений: 17
Награды: 0
Репутация: 65
Блокировки:
| Прекрасный урок.
Знание - сила.
|
|
|
|
Duosora | Дата: Среда, 10 Апреля 2013, 12:22:15 | Сообщение # 25 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Цитата (MrPetronix) сягласян с dress и backfoxi Не согласен с этими быдлокодерами!
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
|
|
|
|
|
|
|