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

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

Felipe Macias
MaciasF0521

(usa Ubuntu)

Enviado em 21/04/2016 - 19:03h

Estou fazendo um programa em C para ordenar os elementos de uma matriz e durante a execução (o programa compilou corretamente) apareceu a mensagem "Falha de segmentação (imagem do núcleo gravada)". Alguém poderia me mostrar o porque da mensagem? A seguir esta o programa
#include <stdio.h>
int main ()
{
double tmp, M[50000][50000];
int i, n, m, k, j, l;
scanf("%i", &n);
scanf("%i", &m);
for(i=0; i<n; i++)
{
for(k=0; k<m; k++)
{
scanf("%lf", &M[i][k]);
}
}
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
for(k=i+1; k<n; k++)
{
for(l=j+1; l<m; l++)
{
tmp=M[i][j];
M[i][j]=M[k][l];
M[k][l]=tmp;
}
}
}
}
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
printf("%.2lf\t", M[i][j]);
}
}
printf("\n");
return 0;
}


  


2. Re: Falha de segmentação (imagem do núcleo gravada)

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/04/2016 - 19:50h

Pior que isto ainda seria o caso de se digitar pow(50.000.0,2.0) valores.
Só usando números aleatórios.

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



3. Re: Falha de segmentação (imagem do núcleo gravada)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/04/2016 - 08:07h

listeiro_037 escreveu:

Pior que isto ainda seria o caso de se digitar pow(50.000.0,2.0) valores.
Só usando números aleatórios.


Em defesa do autor da pergunta original, ele não vai necessariamente digitar dois bilhões e meio de valores. Ele provavelmente só quis ter um blocão predefinido para não ter se de preocupar com alocação. Basta ver que ele pergunta, antes de começar a ler os valores, quais as dimensões úteis da matriz.

Entretanto, há outra coisa errada no programa: o bloco que supostamente faz a ordenação não compara os valores dos elementos antes de trocar suas posições. Não bastasse isso, o tal bloco ainda inventa uma repetição proporcional ao quadrado do número total de elementos da matriz. Ou seja: se a matriz é N×M, a complexidade da repetição é proporcional a (N×M)². Com N e M sendo de ordens de grandezas semelhantes, a complexidade fica em algo da ordem de N^4. Um absurdo total -- ainda mais se se fossem usar mesmo os dois bilhões e meio de elementos, que resultariam em cerca de seis quintilhões de iterações!

Por isso, eu pergunto ao autor: o que você quer dizer com ordenar os elementos da matriz. Por exemplo, como teria de ficar a matriz abaixo após a ordenação que você deseja?

4 7 1
3 2 9
6 8 5



4. Re: Falha de segmentação (imagem do núcleo gravada)

Perfil removido
removido

(usa Nenhuma)

Enviado em 22/04/2016 - 18:20h

Ele não poderia perguntar primeiro dimensão m e dimensão n e depois declarar matriz[m][n]?

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



5. Re: Falha de segmentação (imagem do núcleo gravada)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/04/2016 - 19:25h

Em C, a partir do C99, poderia sim.

Em C++, ele deveria usar std::vector ou std::array.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts