Добавлен
unit EnemyInGroup (unit u, float x, float y, float range) {
    group enemies = CreateGroup()
    unit u_e
    
    GroupEnumUnitsInRange(enemies, x, y, range, Condition(function SimpleCond))
    loop
        u_e = FirstOfGroup(enemies)
        if IsUnitEnemy(u_e, GetOwningPlayer(u)) then
            return u_e
            exitwhen true
        else
            GroupRemoveUnit(enemies, u_e)
        endif
    exitwhen u_e == null
    endloop

    //return u_e
    
    DestroyGroup(enemies)
    enemies = null
    u_e = null
}
Пишет missing return, хотя он есть, чо делать?

Принятый ответ

Мне и нужно, чтобы возвращало первого попавшего
Окей, я тогда чутка переделаю свою версию.
code
globals
    player TransPlayer
    unit LastEnemyUnit
endglobals

function filter takes nothing returns boolean
    if IsUnitEnemy(GetFilterUnit(), TransPlayer) then
        set LastEnemyUnit = GetFilterUnit()
    endif
    return false
endfunction

function EnemyInRange takes unit u, real x, real y, real range returns unit
    set TransPlayer = GetOwningPlayer(u)
    set LastEnemyUnit = null
    call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, Filter(function filter))
    return LastEnemyUnit
endfunction
Плохо, что ретурн позволяет появлятся утечкам.
Только если это локальная переменная, тип которой наследник handle. Если локальная другого типа, или это аргумент функции, или это глобальная, то утечек не будет.
Это, кстати, обещают исправить в будущих патчах.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
21
5 лет назад
Отредактирован Raised
0
Подход не вполне верный. Тебе нужно возвращать не юнита, а группу. Иначе твоя функция оборвется когда обнаружит в группе первого врага. Почему у тебя в цикле 2 exitwhen?
code
    loop
        u_e = FirstOfGroup(unitsInRange)
    exitwhen u_e  ==  null
        if IsUnitEnemy(u_e, GetOwningPlayer(u)) then
            GroupRemoveUnit(unitsInRange, u_e)
            GroupAddUnit(enemies, u_e)
        else
            GroupRemoveUnit(unitsInRange, u_e)
        endif
    endloop

    return enemies
Ну а дальше работаешь с группой.
0
17
5 лет назад
Отредактирован N1ghtSiren
0
Попробуйте вот это. Видимо обрезан код, странно слишком 2 exitwhen видеть
раскрыть
unit EnemyInGroup (unit u, float x, float y, float range) {
    group enemies = CreateGroup()
    unit u_e
    boolean B = false
    unit u 

    GroupEnumUnitsInRange(enemies, x, y, range, Condition(function SimpleCond))
    loop
    exitwhen (B==true)
        u_e = FirstOfGroup(enemies)
        if IsUnitEnemy(u_e, GetOwningPlayer(u)) then
            B = true
            u = u_e
        else
            GroupRemoveUnit(enemies, u_e)
        endif
    endloop    
    DestroyGroup(enemies)
    enemies = null
    u_e = null
	if (B == false) then //Если врагов в группе нет, обнуляем юнита и возвращаем null
	    u = null 
	    return null
	else // Если есть, то возвращаем первого юнита
		return u
}
>>Пишет missing return, хотя он есть, чо делать?
return обозначает выход из функции, должен стоять в самом её конце, ибо тот код, что ниже, будет unreachable code => никогда не выполнится
0
28
5 лет назад
0
Попробуйте вот это.
Но тут ведь тоже в случае наличия противника будет утечка в u, ибо она не обнуляется (баг такой пока есть). Нужно использовать глобалку вместо локальной. Ну и мой вариант получше, там возвращается boolean, а один из вражеских юнитов записан в LastEnemyUnit.
exitwhen (B==true)  // просто exitwhen B.
3
32
5 лет назад
3
PT153, надо еще and != false
0
21
5 лет назад
0
Но тут ведь тоже в случае наличия противника будет утечка в u, ибо она не обнуляется (баг такой пока есть)
С каких это пор параметры функции утекают?
0
28
5 лет назад
Отредактирован PT153
0
С каких это пор параметры функции утекают?
xD
Там это и параметр, и локальная, параметр не заметил. Аргументы да, не утекают.
0
14
5 лет назад
0
Raised:
Подход не вполне верный. Тебе нужно возвращать не юнита, а группу. Иначе твоя функция оборвется когда обнаружит в группе первого врага. Почему у тебя в цикле 2 exitwhen?
code
    loop
        u_e = FirstOfGroup(unitsInRange)
    exitwhen u_e  ==  null
        if IsUnitEnemy(u_e, GetOwningPlayer(u)) then
            GroupRemoveUnit(unitsInRange, u_e)
            GroupAddUnit(enemies, u_e)
        else
            GroupRemoveUnit(unitsInRange, u_e)
        endif
    endloop

    return enemies
Ну а дальше работаешь с группой.
Мне и нужно, чтобы возвращало первого попавшего
Плохо, что ретурн позволяет появлятся утечкам.
0
21
5 лет назад
0
Плохо, что ретурн позволяет появлятся утечкам.
Откуда такая информация?
0
28
5 лет назад
0
Мне и нужно, чтобы возвращало первого попавшего
Окей, я тогда чутка переделаю свою версию.
code
globals
    player TransPlayer
    unit LastEnemyUnit
endglobals

function filter takes nothing returns boolean
    if IsUnitEnemy(GetFilterUnit(), TransPlayer) then
        set LastEnemyUnit = GetFilterUnit()
    endif
    return false
endfunction

function EnemyInRange takes unit u, real x, real y, real range returns unit
    set TransPlayer = GetOwningPlayer(u)
    set LastEnemyUnit = null
    call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, Filter(function filter))
    return LastEnemyUnit
endfunction
Плохо, что ретурн позволяет появлятся утечкам.
Только если это локальная переменная, тип которой наследник handle. Если локальная другого типа, или это аргумент функции, или это глобальная, то утечек не будет.
Это, кстати, обещают исправить в будущих патчах.
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.