Не работает функция

Добавлен
Попробовал написать функцию в cJass. Первый блин получился комом. Использовал это, возможно неправильно.
Функция должна считать количество живых юнитов определенного типа (или двух, нужно если юнит подменяется другим) принадлежащих игроку и возвращать их количество. Собственно код:
library CountLivingUnitsOfPlayerL {
   
#include "cj_types.j"

private integer CLUOP = 0

int CountLivingUnitsOfPlayer(player p, int uid, int uid2) {
    local int i
    local group g = CreateGroup()
    local unit u
    CLUOP = i
    if uid2 != 0 {
        GroupEnumUnitsOfPlayer(g, p, Condition(lambda boolean () {
            u = GetFilterUnit()
            if (!IsUnitType(u, UNIT_TYPE_DEATH) && (GetUnitTypeId(u) == uid || GetUnitTypeId(u) == uid2)){
                CLUOP++
            }}))
    }
    else {
        GroupEnumUnitsOfPlayer(g, p, Condition(lambda boolean () {
        u = GetFilterUnit()
        if (!IsUnitType(u, UNIT_TYPE_DEATH)) && GetUnitTypeId(u) == uid {
            CLUOP++
        }}))
        
    }
    i = CLUOP
    DestroyGroup(g)
    g = null
    u = null
    CLUOP = 0
    return i
}
}

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

Написать return false
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
14
12 лет назад
Отредактирован Hares
0
для начала так:
#include "cj_types.j"

library CountLivingUnitsOfPlayerL
{
    private integer CLUOP = 0; //Не совсем могу понять, зачем она присваивается в начале функции.

    int CountLivingUnitsOfPlayer(player p, int uid, int uid2)
    {
        int i; // Здесь вот ошибка. надо так: int i = 0;
        group g = CreateGroup();
        unit u;
        CLUOP = i; // И здесь код вылетает. Ты присваиваешь CLUOP'у несуществующее значение.

        if (uid2 != 0)
        {
            GroupEnumUnitsOfPlayer(g, p, Condition(lambda bool ()
            {
                u = GetFilterUnit();
                if (!IsUnitType(u, UNIT_TYPE_DEATH) && (GetUnitTypeId(u) == uid || GetUnitTypeId(u) == uid2))
                    { CLUOP++; }
            }
            ));
        }

        else
        {
            GroupEnumUnitsOfPlayer(g, p, Condition(lambda bool ()
            {
                u = GetFilterUnit();
                if ((!IsUnitType(u, UNIT_TYPE_DEATH)) && GetUnitTypeId(u) == uid)
                    { CLUOP++; }
            }
            ));
        }

        i = CLUOP;
        DestroyGroup(g);
        g = null; u = null; CLUOP = 0;
        return i;
    }
}
Содержите свой код в чистоте!
0
14
12 лет назад
0
всё равно выдает кучу ошибок, например: undeclared variable UNIT_TYPE_DEATH, uid, uid2
0
29
12 лет назад
0
Потому что UNIT_TYPE_DEAD это раз.
В лямбде нельзя использовать локалки это два.
0
14
12 лет назад
0
Doc, есть статья по использованию лямбды?
кстати, получается:
>u = GetFilterUnit();
невозможно обнулить?
0
29
12 лет назад
0
Эээ я не о том. Статьи нет, они слишком простые для отдельной статьи. Я о том, что в лямбде нельзя использовать локалки из других функций (конкретно из той, которая лямбду вызывает)
0
14
12 лет назад
0
library UnitsOfPlayerL:
function cj_anonym__1 takes nothing returns boolean
# optional
local unit u=GetFilterUnit()
if ( not IsUnitType(u, UNIT_TYPE_DEAD) and GetUnitTypeId(u) == UnitsOfPlayerL__uid2 ) then
set UnitsOfPlayerLi2=UnitsOfPlayerLi2 + 1
endif
endfunction
function UnitsOfPlayer takes player p,integer uid returns integer
local integer i=0
local group g=CreateGroup()
set UnitsOfPlayerL__uid2=uid
call GroupEnumUnitsOfPlayer(g, p, Condition(function cj_anonym__1))
call DestroyGroup(g)
set g=null
set i=UnitsOfPlayerL__i2
set UnitsOfPlayerL__i2=0
return i
endfunction
library UnitsOfPlayerL ends
на выделенное красным пишет: missing return. Как исправить?
0
1
12 лет назад
0
Написать return false
Принятый ответ
0
29
12 лет назад
0
Temak1, у тебя lambda boolean() а return нету.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.