cell_list *find_depend(char *str) { double hold; last_dep = NULL; find_var = &depend_callback; set_exp(str); get_exp(&hold); return last_dep; }
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; }
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"); }