Сейчас 19:09:08 Четверг, 26 декабря, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
[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, а близзард.ж - обычные юзерфунки. :)


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

dredsssДата: Понедельник, 01 Апреля 2013, 21:38:58 | Сообщение # 3
7 уровень
Группа: Проверенные
Сообщений: 403
Награды: 1
Репутация: 50
Блокировки:
Ty3uK, превосходный вопрос.
Нативный - присущий исходной аппаратной или программной среде. Если мы нос в близзард.жо не суем, то все бэжэ для нас нативки. А если хоть что-то поменяли, то юзерфунки.
Подгружаются собственные нативки или не нативки - вопрос скользкий. И так и так можно сказать.
 

Ty3uKДата: Понедельник, 01 Апреля 2013, 21:40:03 | Сообщение # 4
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
dredsss, да, я согласен. Но я все же склонен к более официальному варианту, как-то оно привычнее, что ли. :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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.
Или я не прав? С технической точки зрения.


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

dredsssДата: Понедельник, 01 Апреля 2013, 22:03:48 | Сообщение # 7
7 уровень
Группа: Проверенные
Сообщений: 403
Награды: 1
Репутация: 50
Блокировки:
Поэтому
Цитата (dredsss)
И так и так можно сказать
 

Ty3uKДата: Понедельник, 01 Апреля 2013, 22:04:16 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Консенсус найден. :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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
Блокировки:
кто такой этот дуос :О,не знаю никаких дуосов, наш учитель Дуосора trollface

Добавлено (02 Апреля 2013, 00:08:23)
---------------------------------------------
самсунг дуос знаю


проклятье ляжет на любого
кто дочитает до конца
нет не дочитывай не надо
остановись ну всё капец
 

SirNikolasДата: Среда, 03 Апреля 2013, 11:53:21 | Сообщение # 11
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата (dredsss)
В мире различают процедуры и функции, но джассеры не различают.
Какие процедуры? trollface
Код
void func(...) { }
Цитата (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)
А я не так выпиливаю.

Сразу вместе со всем сайтом? trollface


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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

Не согласен с этими быдлокодерами!


Не зли других и сам не злись.
Мы - гости в этом мире.
И если что не так - смирись,
Будь поумнее - улыбнись,
Ведь в мире всё закономерно.
Зло, излучённое тобой,
К тебе вернётся непременно.
 

  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz