• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Psicopunk

Cálculo de Rotas pra Robô

6 mensagens neste tópico

Boas, ppl,

estou a programar rotas para um robô móvel autónomo mas tenho tido alguns problemas com a obtenção de rotas.

tenho um extracto de código que não está a funcionar como pretendo.

int calculo_rota(caminho rota[],int matriz[][MATRIZ_MAX])
{
caminho seguinte; // guarda a célula que sai do teste_periferia
seguinte.linha = 0;
seguinte.coluna= 0;
seguinte.valor = 0;
int i=0;

printf("vou calcular os pontos seguintes\n");
while(seguinte.valor != 2)
{

seguinte = teste_periferia(rota,matriz,i); // testa a periferia da celula para encontrar o passo seguinte

i++;
rota[i] = seguinte;

	if(i>=2)
	{

	//testar se estamos num mínimo local
		if(seguinte.valor == rota[i-1].valor)
		{
			if(rota[i-1].valor == rota[i-2].valor)
			{
				printf("Estamos presos num Mínimo Local\n");
				seguinte.valor = 2; //para sairmos do ciclo
				//exit(11); // código de erro em k nao se encontra um caminho por causa de dum minimo local
				return 11;				
			}
		}
	}			


}


if(rota[i].valor == 2)
{
printf("CAMINHO ENCONTRADO\n");	
}

//Printar a rota no ecra

}

O problema está quando encontro um ponto do qual não consigo avançar para o ponto objectivo. Nesse caso quero  retornar o valor 11 para uma variável que recebe a saída desta função. No entanto, ele não acaba com o ciclo e acaba por estourar...

Alguém entende o que estou a fazer mal?

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não estou a ver nenhum erro nessa porção de código.

Para perceber melhor o que estás a fazer era melhor dares uma explicação rapida do que é a estrutura caminho e qual o significado de ter o valor 0 (que dás no seguinte) ou 2 (para terminar). Assim como o código ou explicação da função teste_periferia.

Edit: Afinal acho que tens aí um bug, mas que não é a causa do teu problema. Nunca preenches a posição 0 do array de rotas. Depois quando i é 2, vais às posições 1 e 0, mas 0 não foi inicializado.... pelo menos nesse pedaço de código.

Contudo, se disseste k não termina o ciclo, é porque existem mais problemas...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A posição 0 do vector rota[ ] é preenchida antes de entrar naquela função pois é o ponto inicial ( onde o robô  se encontra actualmente).

A estrutura caminho guarda a linha e coluna da matriz e o valor guardado na matriz[linha][coluna]. Pois o que eu pensei foi criar uma espécie de campo gravitacional em volta do Ponto Objectivo( o valor aqui é 2)

Qt mais longe está do ponto Objectivo maior é o valor do campo. Logo o que faço na função teste_periferia( ) é testar os valores que as células adjacentes têm e ver qual delas é a menor. Dessa forma seguimos para essa célula e obtemos mais um ponto da rota até atingir uma célula com valor = 2 que  é o ponto Objectivo.

O que acontece é que por vezes não se consegue obter um caminho para o ponto objectivo pois adicionei Obstáculos ao Mapa. Logo quando encalhar numa posição, pretendo sair daquela função. E usar um método com pontos intermédios já conhecidos para obter novo caminho até ao Ponto Objectivo.

Mas com o Exit() ele sai do programa quando isso acontece. No entanto, usar o Return dá asneira. Não fecha o ciclo e acaba por trabalhar "lixo" e mais "lixo" até crashar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continuo sem conseguir que o Return acabe com a função. Alguém sabe o porquê disto acontecer? Estive a ler num livro de C sobre o Return e diz explicitamente que acaba a função onde está. Daí nao entender o porquê do ciclo não acabar imediatamente...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema não deve ser o return. Tens de efectuar um debug para apanhar a linha que está a dar erro, e indicar o erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

já consegui... fui eu k meti água. o erro não está nesta função. Está noutra que faz o print da rota no ecra. No fundo essa função nunca parava. Eu pensava que era por esta nunca parar. Mas o erro estava na outra, na condição do ciclo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora