XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
DioD

offline
Опыт: 45,134
Активность:
Знаете ли вы что...
1)
Код:
exitwhen

Очень сильно нагружает циклы даже если проверять с фиксированым значением.
Избегайте наличия нескольких "exitwhen" внутри сложных конструкций, вы рискуете убить поток.
2)
Код:
real & integer

Каждое целое число может быть числом с плавающей точкой, но не наоборот.
Внутри функций цисло с плавающей точкой обязательно должно иметь точку, или вы получите несовпадение типов.
3)
Код:
real string integer boolean

Невозможно обнулить, эти значения обрабатываются автоматически.
4)
Код:
string & boolean

Могут иметь значение "null" для boolean это равносильно false, а для строки "(null)".

Использование строки null приводит к вертолёту, но всё же вы можете вывести это значение функциями вывода текста.
5)
Код:
string

Можно вернуть постредством РБ как интегер, и наоборот, тут для строки можно добится еще одного значения "Вертолёт" обращение к строке которой несуществует посредством РБ крашит вар, это хорошо видно при загрузке игры в которой задействован этот метод.

Отредактировано DioD, 01.03.2007 в 02:25.
Старый 21.02.2007, 19:30
DeT

offline
Опыт: 5,715
Активность:
Цитата:
Сообщение от DiOd
Внутри функций цисло с плавающей точкой обязательно должно иметь точку, или вы получите несовпадение типов.


DeT добавил:
пачиму так?
подробнее плиз
Старый 21.02.2007, 21:11
p01nTT

offline
Опыт: 11,160
Активность:
DioD строка разве не (null)
Старый 21.02.2007, 22:02
NECros88

offline
Опыт: 16,351
Активность:
Цитата:
DioD строка разве не (null)

ммм... а можно вопрос поразвёрнутей?
Старый 22.02.2007, 00:39
DioD

offline
Опыт: 45,134
Активность:
от того какие там скобки ничего не изменится
строка имеет значение "" когда вы например получаете субстринг 9-10 из строки длиной в 3 символа, это сделано для защиты от вертолётов.
Такая строка тоже есть строка, просто пустая, и она регестрируется движком и получает выделеный айди
null это действительно пустая строка, и обращение к такой строке выводит (null) на экран это вроде бы не инициализированая строка, хотя я сталкивался с такими строками только когда сам заносил такое значение.
третье состояние это несуществующая строка, такую строку можно получить только через ретурн баг и она мгновенно крашит вар.
Старый 22.02.2007, 10:56
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Гут, добавил бы что integer, real, string надо инициализировать перед действиями вида set i = i + 1
(local real r = 0, local integer i = 0, local string s = ""(особенно при работе со строками))
Не помню, надо ли инициализировать boolean перед действием типа set b = not b
Старый 28.02.2007, 22:52
DioD

offline
Опыт: 45,134
Активность:
локалки стоит инициализировать всегда.
так как если попытаться что то сделать с переменными что не инициализированы умирает поток
Старый 01.03.2007, 02:27
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Очень сильно нагружает циклы даже если проверять с фиксированым значением.
Избегайте наличия нескольких "exitwhen" внутри сложных конструкций, вы рискуете убить поток.

делал 100 раз, и в сложных консрукциях... почемуто никаких дефектов незамечал...
Старый 01.03.2007, 02:45
DioD

offline
Опыт: 45,134
Активность:
ну и какие это были констуркции?
Старый 01.03.2007, 02:50
J
expert
offline
Опыт: 48,447
Активность:
DioD чет я заметил усмешку в твоем голосе... почему? в основном - в спелах. спелы не покажу...
Старый 01.03.2007, 02:57
DioD

offline
Опыт: 45,134
Активность:
спеллы скорее всего не имели внутри переборов и сложных вызовов.
скажу прямо 2 поиска по группе (найти всех с наименьшей жизнью и второй с наибольшей маной) с условиями живут с эксит венами вешаются
Старый 01.03.2007, 03:33
J
expert
offline
Опыт: 48,447
Активность:
а может быть другая причина подвешивания потока в таких случаях? мб просто болшое количество вызов функций, и вар прекращает выполнение?
Старый 01.03.2007, 04:13
Lord of Death
Потерянный надолго
offline
Опыт: 3,008
Активность:
Интересные заметки, про то что интегер ещё может стать реальной я не знал.
Старый 01.03.2007, 07:02
DioD

offline
Опыт: 45,134
Активность:
дело в том что если ты можешь присвоить 300там переменным значение или один раз включить эксит вэн в цикл.
я при заполнении массивов имел разницу в 1000 итераций между одним эксит веном и двумя.
Старый 01.03.2007, 07:31
p01nTT

offline
Опыт: 11,160
Активность:
просто запущенный цикл с изменением целого и вывода(BJDebugMsg'om) его выполнился у меня 808 раз,с exitwhen i == 1000000 796 помоему,в то время как изменение значения set i = i + 1(без BJDebugMsg) и exitwhen'om срабатывал 23074,тоесть при exitwhen i == 23074(при exitwhen i == 100000 i было равно 23076,а без exitwhen'a 42857),на 1 больше и цикл не завершается, тоесть убивание потока происходит и без exitwhen'a, но он тоже влияет, тоесть максимальное количество циклов напрямую зависит от количества функций и exitwhen'ов. Кстати при затухании цикла и его невыполнении цикл не заканчиваетс и все функции после него не выполняются.

p01nTT добавил:
далее: проверка цикла с 2мя переменными показала: без exitwhena: 23077 и 23076,с 15789 и 15789,с 2мя exitwhen'ами: 12000 и 12000,с нативкой CreateTrigger() без exitwhen'a - 21429 и 21428,
с BJDebugMsg("a") и без exitwhena - 810 раз, тоесть BJ функции нагружают цикл в 100ни раз больше чем exitwhen, но exitwhen нагружает больше чем нативки раза в 1.5-2,то есть нельзя сказать что exitwhen сильно нагружает цикл
Старый 01.03.2007, 10:06
J
expert
offline
Опыт: 48,447
Активность:
p01nTT вообщем как я и говорил... но нативки нагружают поток поразному, одни больше други меньше, такчто судить о том что чтото нативки быстрее/медленее exitwhen врятли можно
Старый 01.03.2007, 10:13
p01nTT

offline
Опыт: 11,160
Активность:
Jon ну это да, но всё таки если сравнивать BJ нативки и exitwhen, то exitwhen ~ native << BJ
следовательно exitwhen не особо сильно нагружает поток
Старый 01.03.2007, 10:19
Toadcop

offline
Опыт: 54,313
Активность:
да это известно кроме того что буль может быть нуль ?! мне кажетьса это ничего хорошего...
Цитата:
"Вертолёт"
это относительно...
Старый 01.03.2007, 14:52
DioD

offline
Опыт: 45,134
Активность:
дело в том что эксит вэн в сложных конструкциях сравнивает не с чистол а может с юнитом или с кешевыми записями, как в случае с таблицами, там вообще разница огромна.
Старый 01.03.2007, 18:56
just_dont_do_it
...and never ever do it
offline
Опыт: 493
Активность:
Сильно повторяемые строчки кода грузят поток пропорционально сумме времени на вызов всех функций внутри них. exitwhen выполняется всегда при каждом проходе цикла и функционально эквивалентен if.

Поэтому тормоза в случае сильно тяжелых потоков и функций можно уменьшить, переделав сложное условие в nested if

Код:
//часть кода будет отсечена на максимально простой проверке
if i == 1 then
  // еще часть не пройдет здесь
  if не_очень_тяжелая_функция() == другая_функция() then
    //ну а тут уже то, что ранее никак не отсеклось
    exitwhen очень_тяжелая_функция() == тоже_тяжелая_функция()
  endif
endif
Старый 10.04.2007, 12:00
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 20:34.