示例#1
0
文件: afLib.cpp 项目: alanswx/afLib
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();
}
示例#2
0
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;
}
示例#3
0
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;
	}
}
示例#4
0
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 */