示例#1
0
cell_list *find_depend(char *str)
{
    double hold;
    last_dep = NULL;
    find_var = &depend_callback;
    set_exp(str);
    get_exp(&hold);

    return last_dep;
}
示例#2
0
bool CMonster::ReplaceSoul(const MonsterInfo &info, bool boss)
{
	bBoss = boss;
	id = info.ID;
	name = info.name;
	set_head(info.Head);
	set_Lv(info.level);
	set_exp(info.exp);
	set_hp_m(info.hp);
	set_mp_m(info.mp);
	set_dc(info.DC1, info.DC2);
	set_mc(info.MC1, info.MC2);
	set_sc(0, 0);
	set_ac(info.AC, info.AC);
	set_mac(info.MAC, info.MAC);
	set_intervel(info.interval);

	QString str[10] = { QStringLiteral("ÆË»÷"), QStringLiteral("³åײ"), QStringLiteral("¿ÖÏÅ"), QStringLiteral("·É»÷"), QStringLiteral("Ó°»÷"),
		QStringLiteral("¶¾Êõ"), QStringLiteral("´ÎÉù²¨"), QStringLiteral("¼«ËÙ"), QStringLiteral("¾ÞÁ¦"), QStringLiteral("¼ṳ̀") };
	skill.name = str[qrand() % 10];
	return true;
}
示例#3
0
void calculate_values()
{
    cell_list ***depend = NULL;
    cell_list *first = NULL;
    cell_list *sorted = NULL, *sorted_last = NULL;
    cell_list *p = NULL;
    int i,j;

    //rtlDebugOutString("calc");

    abort_calc = 0;
    depend = (cell_list***)allocmem(col_count * sizeof(void*));
    for (i = 0; i < col_count; i++)
    {
        depend[i] = (cell_list**)allocmem(row_count * sizeof(void*));
        for (j = 0; j < row_count; j++)
        {
            if (values[i][j])
                freemem(values[i][j]);
            values[i][j] = NULL;

            if (cells[i][j] && cells[i][j][0] == '=')
            {
                depend[i][j] = find_depend(cells[i][j] + 1);		// после =
                if (abort_calc)
                {
                    values[i][j] = (char*)allocmem(2);
                    values[i][j][0] = '#';
                    values[i][j][1] = '\0';
                    abort_calc = 0;
                    continue;
                }
                cell_list *cur;
                cur = (cell_list*)allocmem(sizeof(cell_list));
                cur->x = i;
                cur->y = j;
                cur->next = first;	// вставили тек. ячейку в начало списка ячеек с формулами
                first = cur;
            }
        }
    }

    //rtlDebugOutString("depend end");
    // топологическая сортировка
    if (!first)
        goto free_memory;

    if (abort_calc)
        goto free_memory;

    while (first)
    {
        // найти наименьший элемент. если его нет - ошибка, т.к. циклическая зависимость
        cell_list *prev = NULL,*min = first;

        bool is_min;
        while (min)
        {
            cell_list *p = first;
            is_min = 1;
            while (p && is_min)
            {
                if (is_in_list(p,depend[min->x][min->y]))
                    is_min = 0;
                p = p->next;
            }
            if (is_min)
                break;
            prev = min;
            min = min->next;
        }
        if (!is_min)
        {
            abort_calc = 1;
            goto free_memory;		// все плохо. ужасно. я плакаю, но пишу goto
        }
        // надо убрать минимум во второй список
        if (prev == NULL)
        {
            first = first->next;
        }
        else
        {
            prev->next = min->next;
        }
        /*
        min->next = sorted;
        sorted = min;
        */
        if (sorted == NULL)
        {
            sorted = min;
            sorted_last = min;
        }
        else
        {
            sorted_last->next = min;
            sorted_last = min;
            min->next = NULL;
        }
    }

    // вычисление значений
    //rtlDebugOutString("sort end");

    p = sorted;
    while (p)
    {
        double d;
        abort_calc = 0;
        set_exp(cells[p->x][p->y]+1);	// все что после "="
        find_var = &calc_callback;
        if (get_exp(&d))
        {
            char *new_val = ftoa(d);
            if (values[p->x][p->y] && strcmp(values[p->x][p->y],new_val) == 0)
            {
                freemem(new_val);
            }
            else
            {
                if (values[p->x][p->y])
                    freemem(values[p->x][p->y]);
                values[p->x][p->y] = new_val;
                sel_moved = 0;
            }
            //sprintf(debuf,"calc %U %U formula %S result %f",p->x,p->y,cells[p->x][p->y]+1,d);
            //rtlDebugOutString(debuf);
        }
        else
        {
            values[p->x][p->y] = (char*)allocmem(2);
            values[p->x][p->y][0] = '#';
            values[p->x][p->y][1] = '\0';
            //sprintf(debuf,"calc %U %U formula %S result #",p->x,p->y,cells[p->x][p->y]+1);
            //rtlDebugOutString(debuf);
        }
        p = p->next;
    }

    if (abort_calc)
        goto free_memory;

    //rtlDebugOutString("calc end");


    // освобождение памяти

free_memory:

    p = sorted;
    while (p)
    {
        cell_list *tmp = p->next;
        cell_list *pp = depend[p->x][p->y];
        while (pp)
        {
            cell_list *tmp = pp->next;
            freemem(pp);
            pp = tmp;
        }
        freemem(p);
        p = tmp;
    }

    for (i = 0; i < col_count; i++)
        freemem(depend[i]);
    freemem(depend);

    //rtlDebugOutString("freemem end");


}