Сейчас 16:02:36 Понедельник, 25 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Bru  
[Jass] Урок 2. Два вида переменных в Jass.
[DUОS]Дата: Четверг, 18 Ноября 2010, 20:43:05 | Сообщение # 1
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Итак, после ознакомления с азами Jass копнём чуть поглубже и разберём два вида переменных.
В Jass существует 2 вида переменных - локальные и глобальные. Разберём плюсы и минусы каждого из них.

Локальные:
+ Сохраняют своё значение после ожиданий.
+ Создаются уникально при каждом запуске триггера (не перезаписываются после второго запуска триггера).
+ Легко регулируемы.
+ MUI.

- Действуют только в пределах функции, где их задали.

Глобальные:
+ Действуют во всех триггерах карты.

+- MPI (Хоть и массивным способом)

- Есть риск потерять значение после ожидания (Если триггер запустится во время ожидания, переменная перезапишется).
- Каждый раз нужно писать приставку udg_
- Немного неудобны по сравнению с локальными.



Лучше по возможности отказываться от глобальных переменных и использовать только локальные (Исключение - хеш-таблицы), т.к. они дают гарантию того, что значение сохранится.

Как объявить локальную переменную? Очень просто:

Code
local <тип> <название>

Пример:
Code
local integer i
Это будет целочисленная под названием i. Вводя название, мы обращаемся к целочисленной переменной.
Кое-когда объявляют переменные и тут же задают им значение:
Code
local <тип> <название> = <значение>
Пример:
Code
local integer i = 0
Тогда наша целочисленная будет равна 0.

Можно задать её значение не сразу, а по ходу кода. Делают это так:

Code
set <название> = <значение>
Пример:
Code
set i = 0

Подобным образом задают глобальные переменные, но добавляют приставку udg_
Code
set udg_<название> = <значение>
Пример:
Code
set udg_Integer = 0
.
Глобальные переменные создаются в Редакторе переменных, локальные же - только в функциях непосредственно.

Переменные бывают утечные (те, которые наследуются от типа handle), их надо обнулять:

Code
set <название> = null
. Подробнее об этом читаем тут. Неутечные типы переменных: boolean, integer, real. Запомните их.

Вот и всё. Ждите д/з.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

H_A_PKДата: Четверг, 18 Ноября 2010, 21:11:39 | Сообщение # 2
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
Д/з: Потренироваться с этими переменными, как глобальными так и локальными, ваши результаты выкладывайте на следующем уроке. Возьмити любой ваш триггер, конвертируйте его в текст и все те глобалки заменить локальными переменными, обнулить их в конце. Непосредственно я дам вам лёгкий пример:
до:

Code
function Trig_NewTrigger_Actions takes nothing returns nothing
       call DisplayTextToPlayer(GetTriggerPlayer(), 0,0, "Привет " + GetPlayerName(GetTriggerPlayer()))
endfunction

//================================
function InitTrig_NewTrigger takes nothing returns nothing
          set gg_trg_NewTrigger = CreateTrigger()
          call TriggerAddAction(gg_trg_NewTrigger, function Trig_NewTrigger_Actions)
          call TriggerRegisterPlayerChatEvent( gg_trg_NewTrigger, Player(0), "", false)  //Player(0) это игрок один красный
endfunction

после:

Code
function Trig_NewTrigger_Actions takes nothing returns nothing

       local player p = GetTriggerPlayer()
       local string s = GetPlayerName(p)
             
       call DisplayTextToPlayer(p, 0,0, "Привет " + s)
             
       set p = null
       set s = ""
              
endfunction

//================================
function InitTrig_NewTrigger takes nothing returns nothing
          set gg_trg_NewTrigger = CreateTrigger()
          call TriggerAddAction(gg_trg_NewTrigger, function Trig_NewTrigger_Actions)
          call TriggerRegisterPlayerChatEvent( gg_trg_NewTrigger, Player(0), "", false) //Player(0) это игрок один красный
endfunction

С глобальными переменными аналогично



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


Сообщение отредактировал H_A_PK - Четверг, 18 Ноября 2010, 21:40:40
 

BinGOДата: Пятница, 19 Ноября 2010, 01:38:51 | Сообщение # 3
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Я думаю, было бы уместно тут же и про массивы упомянуть, хотя бы про объявление локальных.
Ах да, насчет этой "д/з". Раз уж я тут, то в каком виде отправлять (через лс/где-то на сайте/через что-то другое?) и кому? :D
 

H_A_PKДата: Пятница, 19 Ноября 2010, 16:15:56 | Сообщение # 4
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
В лс мне или [DUОS]у.

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

[DUОS]Дата: Суббота, 20 Ноября 2010, 14:32:40 | Сообщение # 5
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (B1nGO)
Я думаю, было бы уместно тут же и про массивы упомянуть, хотя бы про объявление локальных.

local <тип> array <название>

Задаётся каждый элемент массива отдельно.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

BinGOДата: Воскресенье, 21 Ноября 2010, 12:25:36 | Сообщение # 6
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Я знаю, как они объявляются; я имел в виду, что в статье это бы не помешало. Все-таки речь идет об объявлении переменных, почему бы сразу массивы не написать?

Добавлено (21-11-2010, 12:25)
---------------------------------------------
Нет, B1nGO, не уместно.
В следующих утверждениях идея правильноя, но незнание афтором терминоф искажает или убивает смысл:
Легко регулируемы.
Каждый раз нужно писать приставку udg_
Переменные бывают утечные (те, которые наследуются от типа handle), их надо обнулять
Задаётся каждый элемент массива отдельно

 

RoBoT1Дата: Воскресенье, 21 Ноября 2010, 22:50:28 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 1454
Награды: 2
Репутация: 240
Блокировки:
Ммм... Интересно! А когда 3 урок и про что он будет (если не секрет)?
 

H_A_PKДата: Понедельник, 22 Ноября 2010, 06:51:40 | Сообщение # 8
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
Quote (RoBoT1)
Ммм... Интересно! А когда 3 урок и про что он будет (если не секрет)?

В следующий четверг
Quote (RoBoT1)
если не секрет

секрет :ъ


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

RoBoT1Дата: Пятница, 26 Ноября 2010, 16:39:35 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 1454
Награды: 2
Репутация: 240
Блокировки:
Ждёмс...!

Добавлено (26-11-2010, 16:39)
---------------------------------------------
H_A_PK, когда 3 урок то? Ты сказал 25 числа выложишь!

Сообщение отредактировал RoBoT1 - Пятница, 26 Ноября 2010, 16:43:13
 

3JIODEйДата: Пятница, 26 Ноября 2010, 17:36:27 | Сообщение # 10
6 уровень
Группа: Заблокированные
Сообщений: 198
Награды: 0
Репутация: 47
Блокировки:
RoBoT1, я не думаю что писать уроки это весело, нужно желание)

Грац меня с шестым взломом администрации
 

RoBoT1Дата: Пятница, 26 Ноября 2010, 22:23:04 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 1454
Награды: 2
Репутация: 240
Блокировки:
3JIODEй, ясное дело! Но H_A_PK сказал что 25 числа выложит!
 

SirNikolasДата: Воскресенье, 28 Ноября 2010, 16:49:15 | Сообщение # 12
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Как лучше вызвать функцию: передав ей переменную/константу или определенное значение?
Иными словами, занимает ли время обращение к переменной?


 

3JIODEйДата: Вторник, 30 Ноября 2010, 19:22:30 | Сообщение # 13
6 уровень
Группа: Заблокированные
Сообщений: 198
Награды: 0
Репутация: 47
Блокировки:
H_A_PK, давай уже результаты >(
Или надоело учить? хД


Грац меня с шестым взломом администрации
 

rixt7956Дата: Суббота, 11 Декабря 2010, 21:14:08 | Сообщение # 14
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Quote (|DUОS|)
Неутечные типы переменных: boolean, integer, real. Запомните их.
Ты забыл про string :)


Сообщение отредактировал rixt7956 - Суббота, 11 Декабря 2010, 21:14:25
 

H_A_PKДата: Суббота, 11 Декабря 2010, 22:06:39 | Сообщение # 15
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
Quote (rixt7956)
Ты забыл про string :)

он в некоторых случаях утечен, надо в "" его


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

rixt7956Дата: Суббота, 11 Декабря 2010, 22:45:14 | Сообщение # 16
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Quote (H_A_PK)
он в некоторых случаях утечен, надо в "" его
1000000000 раз говорили что так делать не надо, это тоже самое что присвоить пустую строку, а пустая строка тоже строка :)

Добавлено (11-12-2010, 22:45)
---------------------------------------------
Тем более строка не является игровым объектом :)

 

H_A_PKДата: Воскресенье, 12 Декабря 2010, 17:38:58 | Сообщение # 17
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
rixt7956, спроси у дуси

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

rixt7956Дата: Понедельник, 13 Декабря 2010, 18:00:24 | Сообщение # 18
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
H_A_PK, Скожу тебе так, когда мы присваиваем переменной значение чего либо, к примеру юнита, мы присваиваем не юнита, а его хэндл, и так же когда мы создаём юнита, создаёться новый хэндл, а строка не создаёться через функцию, а мы просто присваиваем ей значение, так же как реальной или целочисленой, но если нет хэндла, то зачем её обнулять,ведь переменные обнуляються только для того что бы не был "висячий" хэндл,обнуление таким способом, это тоже самое что присваивать реальной 0 :)

Сообщение отредактировал rixt7956 - Понедельник, 13 Декабря 2010, 18:02:55
 

H_A_PKДата: Понедельник, 13 Декабря 2010, 19:28:15 | Сообщение # 19
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
Quote (rixt7956)
H_A_PK, Скожу тебе так, когда мы присваиваем переменной значение чего либо, к примеру юнита, мы присваиваем не юнита, а его хэндл, и так же когда мы создаём юнита, создаёться новый хэндл, а строка не создаёться через функцию, а мы просто присваиваем ей значение, так же как реальной или целочисленой, но если нет хэндла, то зачем её обнулять,ведь переменные обнуляються только для того что бы не был "висячий" хэндл,обнуление таким способом, это тоже самое что присваивать реальной 0 :)

это я итак знаю -.-
Code
local string s = "buba"
set s = ""
if GetLocalPlayer() ==Player(0) then
  set s = "model"
endif

имеет смысл
я говорю, онулять не нужно всегда ведь, иногда ;)


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

rixt7956Дата: Понедельник, 13 Декабря 2010, 22:09:23 | Сообщение # 20
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
А когда надо?
 

BinGOДата: Вторник, 14 Декабря 2010, 02:43:30 | Сообщение # 21
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Обнулять надо переменные, которые происходят от типа handle и обнуляются путем
Code
set <var> = null
 

rixt7956Дата: Вторник, 14 Декабря 2010, 07:21:07 | Сообщение # 22
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
я это знаю, но у стрки нет handle, так когда их обнулять?
 

  • Страница 1 из 1
  • 1
Поиск:

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