В хорошем дизайне добавление вещи стоит дешевле, чем сама эта вещь. — Томас Гейл
На прошлых уроках мы познакомились с множеством вещей, которые (судя по ответам на вопросы) понятны далеко не всем. Но они нужны были для того, чтобы расширить их понимание в дальнейшем. Вот сегодня мы познакомимся с тем, что такое функция. Функция - составляющая программы, которая имеет имя и которую могут вызывать другие части программы до бесконечности. Может возвращать какое-то значение. В языке JASS функции делятся на native, BJ и User-Defined. Функции типа native не могут быть открыты для подробного просмотра. Это те функции, которые в движок уже зашили разработчики. Функции BJ - содержимое файла Blizzard.j Функции User-Defined пишутся пользователями.
Давайте несколько разберёмся. Жирными словами выделены ключевые слова, которые объявляют нашу функцию. Подчёркнутые параметры я расскажу отдельно. имяФункции - имя функции. Обязательно на английском языке. В качестве имени функций нельзя указывать имена уже объявленных функций, глобальные переменные, типы переменных, ключевые слова (return, set, call, type, nothing, null, function, local, globals, endglobals, takes, returns, endfunction, loop, endloop, if, then, else, elseif, endif, exitwhen, constant, native). Если вы нарушите сказанное мною выше, не удивляйтесь, если парсер вам выдаст ошибку. параметры - то, что вы будете передавать в функции. Когда мы изучим переменные (на уроке 4), вы поймёте, сколько разных типов можно объявить. Перечисляются принимаемые функцией компоненты через запятую, если их нет, то ставится nothing. Если принимаемый параметр только один, тогда запятую ставить вообще не надо. После последнего аргумента запятая ТОЖЕ НЕ СТАВИТСЯ. Все это запомнили? Объявляются они в формате типПеременной имяПараметра. Пример: integer i. типПараметра - то, что наша функция будет возвращать. Здесь указывается тип БЕЗ ИМЕНИ. Просто integer, real, string, boolean и т.п. Просто тип. телоФункции - здесь мы пишем то, что функция будет делать (помните задание Hello World? В данном случае call BJDebugMsg("Hello World!") было телом функции).
Также я хочу сказать и о том (для любителей поизвращаться), что объявлять новую функцию в теле другой функции запрещено, иначе парсер будет крыть матом. Вызывать функцию, напротив, нужно именно в теле уже заданной. Делается это так:
callимяФункции(принимаемыеПараметры)
принимаемыеПараметры в данном случае предоставляют функции всё, что она должна брать. Их должно быть ровно столько, сколько требует функция: не больше и не меньше. Кроме того, их тип указывать здесь не нужно. Допустим, у нас объявлена следующая функция:
functionDoCountingtakesinteger ireturnsnothing
Допустим, нужно послать функции число 5. Тогда вызывать её мы будем так:
callDoCounting(5)
Каждая новая функция вызывается с новой строки. Ну вот, познакомились с функциями! Теперь перейдём к оценке домашнего задания.
Если проводить аналогию программирования с пахотным делом, что является "жнецом" кода? Компилятор
Как написать текст с двойными кавычками в строке в JASS? Написать экранирующий символ \ перед кавычкой. Можно просто написать двойной апостроф ''. Компилятор переварит.
Проводя аналогию потока с текущей водой, как объяснить на языке программиста внезапную заморозку воды? Перегрузили поток.
Проводя аналогию потока с текущей водой, что означает открытие и закрытие крана? Открытие/закрытие исполняющей программы.
Если бы условия и действия поженились и переехали жить к условиям, код был бы асинхронный или синхронный? Если бы вы читали внимательно, вы бы легко поняли, что код синхронен.
Как правильно: Jass, JASS, Jass2, J или JASS2, когда речь идёт о языке скриптинга на WarCraft? Всё из перечисленного.
Можно ли называть триггеры по-корейски? Нежелательно. В кашу код превратите.
anree Практика: 5- (TriggerSleepAction( 0.00 ) зачем?! Не мусорь код...) Теория: (3*5/7) = 2 (некоторые ответы засчитал с натяжкой, но пойдёт)
Diabfall Практика: 0 (Карты не увидел) Теория: (3*5/7) = 2+ (Улыбнул ответ на последний вопрос, а второй вопрос отвечен только наполовину. Но я засчитал весь.)
Vladhellgate Практика: 5+ Теория: (4*5/7) = 3-
Imba_pvL Практика: 5- (сказал же: СОЗДАВАТЬ ТОЛЬКО ОДИН ТРИГГЕР) Теория: (1*5/7) = 1- (похоже, что тут это самый низкий результат)
goldplay99 Практика: 5+ (понятное же дело с тобой, статейщик, хех) Теория: (4*5/7) = 3- (меня очень рассмешил ответ на последний вопрос: та же ошибка уже у второго ученика))) )
Pavell Практика: 5+ Теория: 0 (И где она?)
Dangalor Практика: 5++ (единственный человек, сумевший реализовать нормальное экранирование) Теория: 0 (И где она?)
Fredbob Практика: 5+ Теория: (3*5/7) = 2+ (Да, удивил ответ на первый вопрос...)
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
Сообщение отредактировал Duosora - Вторник, 02 Апреля 2013, 16:12:22
Добавлено (02 Апреля 2013, 01:11:03) --------------------------------------------- э, почему урок так внезапно заканчивается ? где же ретурны, ещё примеры с аргументами, на кгме в своё время целый большой пример был, эту тему надо подробней раскрыть
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
Сообщение отредактировал H_A_PK - Вторник, 02 Апреля 2013, 01:12:11
Duosora, а можеш обяснить как самому создавать новые функции. именно ради етого я пришол. сори что пропасивил 1й урок
Я дам практику на четвёртом уроке, там это будет объясняться весьма подробно
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
То оценки не говорят за домашнюю работу, то в прогульщики записывают... Что за беспредел? >(
oops, список неверно отфильтровало Екскьюзес.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
Ээээ почему я прогульщик? Что я пропустил?! Я на сайте каждый день, урок недавно появился, только только его смог посмотреть!
Добавлено (02 Апреля 2013, 16:55:26) --------------------------------------------- Ааа, теперь всё понял. Выпишите меня из прогульщиков сдал же второй урок. А дз где?
Проводя аналогию потока с текущей водой, как объяснить на языке программиста внезапную заморозку воды? Перегрузили поток.
Угодайка. Вода замороженная, отличается от воды жидкой тем, что не сможет течь ни через открытый кран, ни через закрытый. Если поток перенагружен, то он отнимает большую часть вычислительных ресурсов, вода прет как хрень от Кинга. А вот если перенагружен какой-то другой поток, то он может потребить так много вычислительных ресурсов(конкретно памяти), что работа того потока, который вода, станет невозможной. И все же вода будет стоячей, а не замороженной.
Случаи, когда вода может не течь: поток ждет своей очереди на выполнение в псевдомногопоточной среде; поток ждет появления достаточных вычислительных ресурсов для своего выполнения; поток ждет данные для обработки; поток был прерван по команде одного из других потоков. Если в потоке возникла ошибка, то поток на время ее обработки замораживается, потом может быть разморожен, изменен или заве
Цитата (Duosora)
Проводя аналогию потока с текущей водой, что означает открытие и закрытие крана? Открытие/закрытие исполняющей программы.
Программы не открывают и не закрывают. Открывают/закрывают файлы. Завершение работы потока аналогично исчезновению воды. Запуск программы можно связать с открытием крана, завершение работы с закрытием крана - нет. Кран символизирует управление водой. Управяет потоком программная/аппаратная среда выполнения. Закрытие крана означает временную остановку выполнения потока средой; открытие - запуск или возобновление выполнения потока средой.
Цитата (Duosora)
Всё из перечисленного.
J - не встречается на популярных тематических ресурсах.
Цитата (Kakolookia)
беспредел
Добавлено (02 Апреля 2013, 19:11:41) ---------------------------------------------
Цитата (BlackFoxi)
потом может быть разморожен, изменен или заве
потом может быть разморожен, изменен или завершен. В Jass поток сразу завершается. Если внештатная ситуация произошла в среде выполнения, то поток может быть заморожен, как частный случай всего, что угодно. ------------ Мое мнение о функциях: http://warcraft3ft.info/forum/39-44987-1602803-16-1364834395
типПараметра - то, что наша функция будет возвращать. Здесь указывается тип БЕЗ ИМЕНИ. Просто integer, real, string, boolean и т.п. Просто тип.
Добавь, что возрашать можно 1 аргумент, а то бывали случаи. Насчет с ответом - перезагрузка потока, не согласен))
Добавлено (02 Апреля 2013, 23:26:30) --------------------------------------------- Если кто-то будет писать функцию как в уроке, будет критовать) Не слово о ретурне))
Я знаю *ВСЕ*, но *ВСЕ* - ничегошеньки незнает обо мне.
Случаи, когда вода может не течь: поток ждет своей очереди на выполнение в псевдомногопоточной среде; поток ждет появления достаточных вычислительных ресурсов для своего выполнения; поток ждет данные для обработки; поток был прерван по команде одного из других потоков.
Цитата (BlackFoxi)
Кран символизирует управление водой. Управяет потоком программная/аппаратная среда выполнения. Закрытие крана означает временную остановку выполнения потока средой; открытие - запуск или возобновление выполнения потока средой.
goldplay99, шутник. На рб куча классных карт было, многие периодически играют на старых патчах. А на 1.24 работает RtC, что позволяет делать классные фишки вроде MMO с сервером.