Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

AprendizZ

SIGSEGV - segmentation fault

Mensagens Recomendadas

AprendizZ

Caros amigos,

Criei um programa que lê um ficheiro com números e transforma-os num array.

Depois o resultado são algumas operações feitas com esse array: soma dos elementos,

máximo, mínimo, etc.

O problema é no final a compilação é correcta e os testes correm bem mas depois quando

submeto num sistema de avaliação dá-me o erro SIGSEGV, ou seja, segmentation fault.

Pelo que entendo tem a ver com a ocupação de um endereço de memória já previamente

ocupado, não? Então como posso solucionar isto? O que poderá estar o meu programa a

fazer para causar este erro?

Obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AprendizZ

Ei-lo:

#include <stdio.h>

#define MAX_AVENUES 100
int rats[MAX_AVENUES];
int n_avenues;

void read_rats (FILE *f, char *format)
{
int x = 0;
fscanf(f, format, &n_avenues);
while (fscanf(f, format, &rats[x]) != EOF)
	x++;
}

int rats_total (int *a, int n)
{
int i;
int t = 0;
for(i = 0; i < n; i++)
	t += a[i];
return t;
}

double rats_average (int *a, int n)
{
return (double) rats_total(a,n) / n;
}

int rats_max (int *a, int n)
{
int i;
int mx = a[0];
for(i = 1; i < n; i++)
	if (mx < a[i])
		mx = a[i];
return mx;
}

int rats_min (int *a, int n)
{
int i;
int mi = a[0];
for(i = 1; i < n; i++)
	if (mi > a[i])
		mi = a[i];
return mi;
}

void rats_read_write (void)
{
int x, y, z;
double w;
read_rats(stdin, "%d");
x = rats_total(rats, n_avenues);
printf("%d ", x);
w = rats_average(rats, n_avenues);
printf("%.2f ", w);
y = rats_max(rats, n_avenues);
printf("%d ", y);
z = rats_min(rats, n_avenues);
printf("%d\n", z);
}

int main (void)
{
rats_read_write();
return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AprendizZ

Quando compilo e executo o programa no Visual C corre tudo bem. Sejam testes vindos

do projecto, sejam testes inventados por mim. Mas quando submeto num avaliador,

neste caso o sistema Mooshak, este deve fazer outros testes onde me responde

Runtime Error com a popup (test T6): SIGSEGV.

Fiz uma pesquisa e deduzi que o programa deve estar a tentar ocupar um endereço

de memória que já está ocupado. Neste caso penso que poderá ter a ver com as

variáveis globais + variável simbólica, mas se assim for como é que corre bem nos

testes locais que faço?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AprendizZ

Desconfio que sim.

Coloquei o valor 100 nessa variável, já experimentei 1000 e também dá o erro.

Os testes que tenho feito não excedem as 10 linhas, cada uma com um único valor.

Ex:

5

1

2

3

4

5

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Tens de saber quais são os limites, senão vais ter sempre um segmentation fault porque estás a aceder a memória para além do array.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AprendizZ

Descobri! Aumentei o valor da variável simbólica de 100 para 10000 e já foi aceite.

Obrigado, as pistas que me deste ajudaram-me a descobrir onde estava o problema.

Mais uma vez, obrigado amigo.

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.