function GroupNumber takes group g returns integer local unit array u local integer i=0 local integer k=0 loop set u[i]=FirstOfGroup(g) exitwhen u[i]==null set k=k+1 set i=k call GroupRemoveUnit(u[i],g) endloop set i=0 loop exitwhen i==k call GroupAddUnit(u[i],g) set u[i]=null set i=i+1 endloop return k endfunction
Первая группа та которую надо добавит, вторая, в которую добавляют.
Code
function AddGroup takes group g1,g2 returns nothing local unit array u local integer i=0 local integer k=0 loop set u[i]=FirstOfGroup(g1) exitwhen u[i]==null set k=k+1 set i=k call GroupAddUnit(u[i],g2) call GroupRemoveUnit(u[i],g1) endloop set i=0 loop exitwhen i==k call GroupAddUnit(u[i],g1) set u[i]=null set i=i+1 endloop endfunction
Чуть позже выложу по больше функций
Сообщение отредактировал rixt7956 - Среда, 23 Февраля 2011, 20:55:53
Faion, Не, это лучше, и при вызове функции, на сколько мне известно ты всё пишешь в одну строку, тем более бж лучше не использовать так как та вызывает ещё одну бж+использует глобалки, и каждый вызов бж, это обращенье к blizzard.j
rixt7956, окей, тогда скажи зачем в "твоем суперкоде" ссылаться опять же на функции этих .j делай с нуля епти, ты же такой крутой тебя не устраивает обычная функция, свою пишешь =_=
чую русским духом пахнет, буржуи гавно росия вперед
Сообщение отредактировал Murador - Среда, 23 Февраля 2011, 22:03:27
Faion, Не, это лучше, и при вызове функции, на сколько мне известно ты всё пишешь в одну строку, тем более бж лучше не использовать так как та вызывает ещё одну бж+использует глобалки, и каждый вызов бж, это обращенье к blizzard.j
Во первых, локалки хоть и быстрее(причем далеко не всегда), но не дают весомого прироста к производительности.
Уж поверь, твой пример не дает никакой прибавки к производительности, а даже наобарот. Куда умнее было оптимизировать бжшку и получить это:
function CountUnitsInGroup takes group g returns integer ForGroup(g, function CountUnitsInGroupEnum) return bj_groupCountUnits endfunction
Твой вариант в сравнении с моим медленее раз в 5-10 минимум.
Это так же быстрее раз в 10 чем твой бредокод:
Code
function GroupAddGroupEnum takes nothing returns nothing GroupAddUnit(bj_groupAddGroupDest, GetEnumUnit()) endfunction
function GroupAddGroup takes group sourceGroup, group destGroup returns nothing bj_groupAddGroupDest = destGroup ForGroup(sourceGroup, function GroupAddGroupEnum) endfunction
В общем как я и говорил выше, незачем изобретать велосипеды.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
Сообщение отредактировал Faion - Четверг, 24 Февраля 2011, 13:48:40
Faion, Некоторые спорят и говорят что ForGroup медленее цикла, а не которые говорят наоборот, вот этот вариант на цикле, что быстрее ForGroup или цикл я не знаю.
Faion, Некоторые спорят и говорят что ForGroup медленее цикла, а не которые говорят наоборот, вот этот вариант на цикле, что быстрее ForGroup или цикл я не знаю.
Вообще то это тот же цикл, в котором нету ничего лишнего, он быстре, как минимум быстрее твоих 2! циклов. Массивов и тонн локалок.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
Faion, ладно, убедил, просто я не юзаю forgroup потомучто надо создовать лишние глобалки( ну в смысле для одного типа одну глобалку), к примеру разве можно нанести урон группе, не занося сначала юнита который наносит урон в глобалку.
Ну если рассматривать твой пример, то там массив не нужен, и делается тоже самое в 1 цикл. Но ты юзаешь массив, а массив это группа однотипных переменных, и он собой создает тонну не нужных данных которые висят в памяти.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
Ну вот стандартный пример для работы с группами, который по сути все и используют.
Code
function CustomForGroup takes group eg returns nothing local unit pu
// Проверяем, существует ли группа if (eg == null) then return endif
loop // Берём первого из групы set pu = FirstOfGroup(eg) // Проверяем не равен ли он нулю, если да то выходим exitwhen (pu == null) // Убираем пикнутого юнита из групы, тем самым мы имитируем продвижение по её массиву call GroupRemoveUnit(eg, pu)
if (>>Твой фильтр для пикнутого юнита<<) then //Твои действия с пикнутым юнитом endif
endloop
endfunction
Обе задачи реализуются используя этот алгоритм.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
Хочу сказаь такую умную вещь, дабы вы избегали ошибок. То что локалки дают большой прирост к производительности - миф. Не редко они даже ее понижают.(Тут нубы которые считают себя отцами должны начать орать что я не шарю).
Локальные переменные, это переменные о которых знает только функция в которую они вложены. Что это нам дает: Во первых при создании огромных программ с тысячами функций нам бы пришлось придумывать огромное кол-во глобалок. Огромное количество глобалок - существенный минус, очень сложно править код. Могут быть проблемы если 1 и та же переменная используется многократно. Весь код становится сильно зависимым.
Тут перечислять можно долго. Однако локалками злоупотреблять не стоит. Их стоит использовать только для обозначения переменных которые могут быть использованы внутри функции и более нигде. Т.е. нету ничего плохого в использовании функциями БЖ, бжшных переменных, другой вопрос что внутри многих функций как правило лишние действия\проверки\дублирование обращений\подмена нативок собой.
Если подвести итог, то не стоит стремится использовать везде только локалки, или только глобалки, необходима золотая середина, с помощью глобалок можно легко передавать данные.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
Faion, Хорошо написал, только к чему это, я уже с тобой согласился на счёт ForGroup
Quote (rixt7956)
Faion, ладно, убедил, просто я не юзаю forgroup потомучто надо создовать лишние глобалки( ну в смысле для одного типа одну глобалку), к примеру разве можно нанести урон группе, не занося сначала юнита который наносит урон в глобалку. :)
Это уже про локалки, все как только узнают о локалках, сразу думают, что локалки это круто, и начинают их использовать везде, а потом пишут код, типо того что у тебя=) Вместо того что бы сделать компактный код, с использованием пары глобалок.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
Он дал аналог существующим BJ функциям, причем весьма не оптимальный и я ему объяснил почему его функции даже хуже, чем те, объяснил почему разумно пользоватся теми BJ, и дал свой пример решения данной проблемы, который наиболее оптимальный.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL