Добавлен
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. Если локальная другого типа, или это аргумент функции, или это глобальная, то утечек не будет.
Это, кстати, обещают исправить в будущих патчах.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
10
5 лет назад
2
должен быть вне цикла и условий return
1
28
5 лет назад
Отредактирован Raised
1
code
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)
        exitwhen u_e == null
        if IsUnitEnemy(u_e, GetOwningPlayer(u)) then
            DestroyGroup(enemies)
            enemies = null
            return u_e  // утечка переменной u_e, используй глобалку.
            // exitwhen true  // зачем это, когда есть return?
        else
            GroupRemoveUnit(enemies, u_e)
        endif
    endloop
    
    DestroyGroup(enemies)
    enemies = null
    u_e = null
    return null  // нет враждебного юнита.
}

А вообще, что находится в функции SimpleCond? Тут можно всё упростить.
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 return boolean
    set TransPlayer = GetOwningPlayer(u)
    set LastEnemyUnit = null
    call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, Filter(function filter))
    return LastEnemyUnit != null
endfunction
замечание от Raised: 1.4 (злоупотребление форматированием) используйте каты
0
14
5 лет назад
Отредактирован Raised
0
quote
 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)
         exitwhen u_e == null
         if IsUnitEnemy(u_e, GetOwningPlayer(u)) then
             DestroyGroup(enemies)
             enemies = null
             return u_e  // утечка переменной u_e, используй глобалку.
             // exitwhen true  // зачем это, когда есть return?
         else
             GroupRemoveUnit(enemies, u_e)
         endif
     endloop
     
     DestroyGroup(enemies)
     enemies = null
     u_e = null
     return null  // нет враждебного юнита.
 }
А вообще, что находится в функции SimpleCond? Тут можно всё упростить.
 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 return boolean
     set TransPlayer = GetOwningPlayer(u)
     set LastEnemyUnit = null
     call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, Filter(function filter))
     return LastEnemyUnit != null
 endfunction
Не использую глобалки
PT153:
quote
 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)
         exitwhen u_e == null
         if IsUnitEnemy(u_e, GetOwningPlayer(u)) then
             DestroyGroup(enemies)
             enemies = null
             return u_e  // утечка переменной u_e, используй глобалку.
             // exitwhen true  // зачем это, когда есть return?
         else
             GroupRemoveUnit(enemies, u_e)
         endif
     endloop
     
     DestroyGroup(enemies)
     enemies = null
     u_e = null
     return null  // нет враждебного юнита.
 }
А вообще, что находится в функции SimpleCond? Тут можно всё упростить.
 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 return boolean
     set TransPlayer = GetOwningPlayer(u)
     set LastEnemyUnit = null
     call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, Filter(function filter))
     return LastEnemyUnit != null
 endfunction
exitwhen true выходит из цикла.
замечание от Raised: 1.4 (злоупотребление форматированием) используйте каты
0
28
5 лет назад
0
exitwhen true выходит из цикла.
У тебя уже есть return который выходит из целой функции. Всё, что после return, просто игнорируется.
LainMikoroso:
Не использую глобалки
Тогда будут утечки.
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. Если локальная другого типа, или это аргумент функции, или это глобальная, то утечек не будет.
Это, кстати, обещают исправить в будущих патчах.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.