Psicopunk Posted December 28, 2007 at 05:13 PM Report Share #156851 Posted December 28, 2007 at 05:13 PM 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 Link to comment Share on other sites More sharing options...
mogers Posted December 28, 2007 at 11:19 PM Report Share #156919 Posted December 28, 2007 at 11:19 PM 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... "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Psicopunk Posted December 29, 2007 at 05:33 PM Author Report Share #156999 Posted December 29, 2007 at 05:33 PM 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... Link to comment Share on other sites More sharing options...
Psicopunk Posted January 2, 2008 at 04:15 PM Author Report Share #157418 Posted January 2, 2008 at 04:15 PM 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... Link to comment Share on other sites More sharing options...
shumy Posted January 2, 2008 at 04:41 PM Report Share #157431 Posted January 2, 2008 at 04:41 PM 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. Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática! Link to comment Share on other sites More sharing options...
Psicopunk Posted January 2, 2008 at 05:28 PM Author Report Share #157447 Posted January 2, 2008 at 05:28 PM 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... Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now