есть одна функция
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) // пример вызова

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

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

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
0
14
5 месяцев назад
Отредактирован host_pi
0
Волчачка: коли обмазаться так хочется:
причём тут хочется или нет?
а что, краши и тормоза по нехватке памяти - лучше?
такое зануление должно быть базой
1
29
5 месяцев назад
1
Главное запомнить что аргументы не текут. Но созданные объекты удалять всё же нужно.

Глобалка

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) // пример вызова

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