Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Airton Cabral

Falha de segmentação (imagem do núcleo gravada)

Recommended Posts

Olá pessoal,

Bom estava fazendo um trabalho aqui e me deparei com o seguinte erro:
"Falha de segmentação (imagem do núcleo gravada)"

O interessante é que o erro só acontece quanto eu digito alguns determinados valores de entrada. Ex.: 13, 21, 26, 65...

 

Gostaria de entender mais esse erro e como posso soluciona-lo.

 

Segue o código:

 

/************************************************
* Autor: Antônio Airton Cabral Neto             *
* Ambiente..: Ubuntu 12.04 LTS                  *
* Compilador: GCC 4.6.3                         *
* Objetivo..: Implementação da função espiral   *
* quadrada                                      *
*************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

// Assinaturas de função
int* espiral(int n);

// Funções
int* espiral(int n) {

	// Encontra número de passos
	int np = (round(sqrt((16*n)+1))-1)/2;


	// Incia variáveis
	int sinal=1;
	int count=0;
	int var=1;
	int posx=0, posy=0;

	for(int i=1; i<=np; i++) {

		// Encontra número de iterações por passo
		int ni = ((i-1)/2)+1;
		
		// Redefine valores importantes
		sinal = sinal * pow((-1),(i-1));
		var = i%2;

		// Realiza operações de iteração
		for(int j=1; j<=ni; j++) {
			if(var==0) {
				// Realiza operação em X
				posx = posx + sinal;
				count++;
			} else if(var==1) {
				// Realiza operação em Y
				posy = posy + sinal;
				count++;				
			}

			// Verifica final
			if(count>=n) {
				// Última iteração				
				int r[2];
				r[0] = posx;
				r[1] = posy;
				return (int*) r;
			}
		}
	}
}

int main(int argc, int* argv[]) {
	int n, ok=1;
	do {
		system("clear");
		if(!ok)
		printf("Digite um valor válido! (Inteiro positivo) \n");
		printf("Digite o valor N: ");
		scanf("%i",&n);
	} while(n<=0);
	int* r = (int*) espiral(n);
	printf("X: %i Y: %i \n",r[0],r[1]);
	return 0;
}

 

Qualquer ajuda é bem vinda.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando essa mensagem ocorre é porque seu programa ta tentando acessar algum endereço de memória incorretamente. Sua função "espiral" em determinados casos, como você citou, acaba não retornando nada, então quando você tenta acessar a variável "r" como "r[0]" ou "r[1]" o programa quebra porque "r" é uma memória vazia devido à "espiral" não ter retornado nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.