есть одна функция
function CreateUnit_Mage takes player id, integer unitid, real x, real y, real face returns unit
	local unit u=null
	set u=CreateUnit(id,unitid,x,y,face)
	call UnitAddAbility(u,'AHbz')
	call UnitAddAbility(u,'AHwe')
	return u
	set u=null
endfunction
как занулить переменную u ?
после return это сделать не получится, т.к. идёт выход из функции
до return если занулить, тогда и возвращать будет нечего
а если не занулять, то получится утечка
а если без переменной u, то не получится добавить абилку
а если вместо локальной использовать глобальную, то ходят слухи, что это утечка - слух1 - слух2
или вариант решения только 1?:
  1. делать на глобалке
  2. после каждого вызова CreateUnit_Mage обнулять эту глобалку сразу после функции?
т.е. вместо одной строки call CreateUnit_Mage мы получаем две слипшиеся строки: call CreateUnit_Mage + set global_u=null ?
или вариант 2 это добавить обнуление глобалки перед назначением ей юнита внутри функции?
	set global_u=null
	set global_u=CreateUnit(id,unitid,x,y,face)
но в примере на тхехелпере заявлено, что такая конструкция утекает: (обнуление глобалки перед её переназначением)
	set G1=null
	set G1=CreateGroup()

Главное запомнить что аргументы не текут. Но созданные объекты удалять всё же нужно.

Глобалка

function CreateUnit_Mage takes player id, integer unitid, real x, real y, real face returns unit
	set bj_lastCreatedUnit = CreateUnit(id, unitid, x, y, face)
	call UnitAddAbility(bj_lastCreatedUnit, 'AHbz')
	call UnitAddAbility(bj_lastCreatedUnit, 'AHwe')
	return bj_lastCreatedUnit
endfunction

Дополнительная функция

function CreateUnit_Mage_Helper takes unit u returns unit
	call UnitAddAbility(u, 'AHbz')
	call UnitAddAbility(u, 'AHwe')
	return u
endfunction	

function CreateUnit_Mage takes player id, integer unitid, real x, real y, real face returns unit
	return CreateUnit_Mage_Helper(CreateUnit(id, unitid, x, y, face))
endfunction

Дополнительный аргумент

function CreateUnit_Mage takes player id, unit u, integer unitid, real x, real y, real face returns unit
	set u = CreateUnit(id, unitid, x, y, face)
	call UnitAddAbility(bj_lastCreatedUnit, 'AHbz')
	call UnitAddAbility(bj_lastCreatedUnit, 'AHwe')
	return u
endfunction

call CreateUnit_Mage(Player(0), null, 'hfoo', 0,0,0) // пример вызова

такое зануление должно быть базой
Не использование локалок для хэндлов должно быть базой.
`
ОЖИДАНИЕ РЕКЛАМЫ...
31
я обычно для этих целей использую глобалку bj_lastCreatedUnit

и не обнуляю ее...
29
А можно было бы и таким способом, коли обмазаться так хочется:

function CreateUnit_MageEx takes unit u returns unit
    call UnitAddAbility(u,'AHbz')
	call UnitAddAbility(u,'AHwe')
    return u 
endfunction

function CreateUnit_Mage takes player id, integer unitid, real x, real y, real face returns unit
	return CreateUnit_MageEx( CreateUnit(id,unitid,x,y,face) )
endfunction
15
Волчачка: коли обмазаться так хочется:
причём тут хочется или нет?
а что, краши и тормоза по нехватке памяти - лучше?
такое зануление должно быть базой
31
Главное запомнить что аргументы не текут. Но созданные объекты удалять всё же нужно.

Глобалка

function CreateUnit_Mage takes player id, integer unitid, real x, real y, real face returns unit
	set bj_lastCreatedUnit = CreateUnit(id, unitid, x, y, face)
	call UnitAddAbility(bj_lastCreatedUnit, 'AHbz')
	call UnitAddAbility(bj_lastCreatedUnit, 'AHwe')
	return bj_lastCreatedUnit
endfunction

Дополнительная функция

function CreateUnit_Mage_Helper takes unit u returns unit
	call UnitAddAbility(u, 'AHbz')
	call UnitAddAbility(u, 'AHwe')
	return u
endfunction	

function CreateUnit_Mage takes player id, integer unitid, real x, real y, real face returns unit
	return CreateUnit_Mage_Helper(CreateUnit(id, unitid, x, y, face))
endfunction

Дополнительный аргумент

function CreateUnit_Mage takes player id, unit u, integer unitid, real x, real y, real face returns unit
	set u = CreateUnit(id, unitid, x, y, face)
	call UnitAddAbility(bj_lastCreatedUnit, 'AHbz')
	call UnitAddAbility(bj_lastCreatedUnit, 'AHwe')
	return u
endfunction

call CreateUnit_Mage(Player(0), null, 'hfoo', 0,0,0) // пример вызова

такое зануление должно быть базой
Не использование локалок для хэндлов должно быть базой.
Принятый ответ
18
Не использование локалок для хэндлов должно быть базой.
Это база только для немытого жаза
31
Vlod, в чистом жассе глобалки использовать запрещается?
18
в чистом жассе глобалки использовать запрещается?
Это актуально только для не****го жаза
Чтобы оставить комментарий, пожалуйста, войдите на сайт.