void afLib::loop(void) { if (isIdle() && (queueGet(&_request.messageType, &_request.requestId, &_request.attrId, &_request.valueLen, &_request.p_value) == afSUCCESS)) { switch (_request.messageType) { case MSG_TYPE_GET: doGetAttribute(_request.requestId, _request.attrId); break; case MSG_TYPE_SET: doSetAttribute(_request.requestId, _request.attrId, _request.valueLen, _request.p_value); break; case MSG_TYPE_UPDATE: doUpdateAttribute(_request.requestId, _request.attrId, 0, _request.valueLen, _request.p_value); break; default: _theLog->println("loop: request type!"); } } if (_request.p_value != NULL) { delete (_request.p_value); _request.p_value = NULL; } checkInterrupt(); }
int bfs(int source, int goal) { int pathFound = FALSE; int destination, element, vertex, i, tmp; for(vertex = 0; vertex < graph.nNodes; vertex++) { parent[vertex] = -1; visited[vertex] = FALSE; } queueAdd(source); parent[source] = -1; visited[source] = TRUE; while (!queueIsEmpty()) { element = queueGet(); destination = 0; while (destination < graph.nNodes) { tmp=-1; for(i=0; i<graph.nNeighbors[element]; i++) { if(graph.neighbors[element][i] == destination) { tmp = i; break; } } if (tmp != -1 && graph.nodesInSearch[element][tmp] > 0 && !visited[destination]) { parent[destination] = element; queueAdd(destination); visited[destination] = TRUE; } destination++; } } if (visited[goal]) { pathFound = TRUE; } return pathFound; }
void update(int mili) { Byte c = 0; if (!queueEmpty(&keys)) { c = queueGet(&keys); if (c == ESC_KEY) exit(0); } Bool mouseEvent = parse_mouse_event(mouseQueue, &mouse); updateHammer(hammer, mili, c, (mouseEvent ? &mouse : NULL)); static Bool shift_flag = false; char k; int i, len; switch (state) { case PLAYING: for (i = 0; i < NUM_PCS; i++) updateCScreen(cscreens[i], hammer, &numPCs, &score->score, mili); if (numPCs == 0) { state = END; hammer->state = GET_HAMMER; } updateButton(helpButton, hammer); if (helpButton->state == CLICKED) state = HELP; updateButton(exitButton, hammer); if (exitButton->state == CLICKED) exit(0); break; case END: if (hammer->state == HIT) { state = SCORE; highScore = isHighScore(highScores, score); } updateButton(helpButton, hammer); if (helpButton->state == CLICKED) state = HELP; updateButton(exitButton, hammer); if (exitButton->state == CLICKED) exit(0); break; case SCORE: if (highScore) { if (c != 0) { if (c == SHIFT_KEY) { shift_flag = true; } if (c == (SHIFT_KEY | RELEASED)) { shift_flag = false; break; } if (c == BACKSPACE_KEY) { len = strlen(score->name); if (len > 0) { score->name[len - 1] = NULL; } break; } k = scancodeToAscii(c); if (k != 0) { len = strlen(score->name); if (len < SCORE_NAME_LEN) { score->name[len] = (shift_flag ? toupper(k) : k); score->name[len + 1] = NULL; } } } } if (hammer->state == HIT && (!highScore || (c != SPACE_KEY && score->name[0] != NULL))) { if (highScore) { putScore(highScores, score); saveHighScores(highScores); } reset_game(); state = PLAYING; } break; case HELP: if (hammer->state == HIT) state = PLAYING; break; default: break; } }
int *distancias(int n, int **A, int c) /* Recebe o número de cidades, uma matriz com os caminhos e a cidade a ser analisada (c). Devolve um vetor com as dis- tâncias até todas as cidades */ { int *d = mallocSafe(n*sizeof(int)); /* Matriz das distâncias */ int j; /* contador */ queueInit(n); /* Criamos a fila */ for(j = 0; j < n; j++) d[j] = n; /* Inicializa a matriz das distân- cias com 'n' - o número de ci- dades, que representa a dis- tância "infinita" */ d[c] = 0; /* A cidade a ser analisada tem distância dela a ela mesma com 0. */ queuePut(c); /* O primeiro elemento da fila, que será analisada, é a ci- dade passada como parâmetro. */ while(!queueEmpty()) /* Este laço é feito no MÁXIMO 'n' vezes, pois cada cidade é colocada na fila, para ter as distâncias analisadas, uma vez apenas */ { int i = queueGet(); /* Pegamos o primeiro elemento da fila */ for(j = 0; j < n; j++) /* Executamos este laço 'n' vezes no MÁXIMO, pois este é o número d checa- gens para os caminhos que faremos na matriz. */ if(s[i][j] == 1 && d[j] == n) { /* Se já tiver sido posto, no passado, é porque já houve um caminho mais curto até lá. Caso con- trário, se houver liga- ção (s[i][j] == 1) e não tiver sido posto ain- da (d[j] == n), fazemos as operações abaixo */ d[j] = d[i] + 1; /* A distância da cidade será a distância até a cidade atual (d[j]) somada de 1. */ queuePut(j); /* Se não tiver entrado ainda, ele é colocado na fila para ser ana- lisado posteriormen- te. */ } /* fim do if */ } /* fim do for */ } /* fim do while */