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

Sign in to follow this  
AprendizZ

SIGSEGV - segmentation fault

Recommended Posts

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.

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other sites
Localhost

Deve ser desse array. Tens a certeza que o valor de MAX_AVENUES está correcto?


here since 2009

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
Localhost

É muito estranho não te terem dado limites. Agora até podes estar a desperdiçar memória.


here since 2009

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.