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

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

wivia
Wivia

(usa CentOS)

Enviado em 15/05/2016 - 18:47h

Pessoal podem me ajudar, tenho que fazer um trabalho pra faculdade mas sempre trabalhavamos com java e agora nessa disciplina estou tendo que mexer com C.
Desde já agradeço.

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


int somaDivisores( int valor )
{
int extra = (int) sqrt( valor ), j, divid, soma = 0;
for( j = 1; j <= extra; j++ )
{
if( valor % j == 0 )
{
divid = valor / j;

if( ( valor / j ) == j )
divid = 0;
soma += j + divid;
}
}
return soma;
}

int main( int argc, char **argv )
{

double fracaoA;
int minimo = atoi( argv[ 1 ] );
int maximo = atoi( argv[ 2 ] );
int range = maximo - minimo;
double amigos[ range ];
int i,j;

for( j = minimo; j <= maximo; j++ )
{
fracaoA = (double) somaDivisores( j ) / j;
amigos[ j - minimo ] = fracaoA;
}

for( i = 0; i <= range; i++ )
{
for( j = i + 1; j <= range; j++ )
{
if( amigos[ i ] == amigos[ j ] )
{
printf( "Os numeros %d e %d são mutuamente amigos.\n",
( minimo + j ), ( minimo + i ) );
}
}
}
return 0;
}


falha

Program received signal SIGSEGV, Segmentation fault.
0xb7e03842 in __GI_____strtol_l_internal (nptr=nptr@entry=0x0,
endptr=endptr@entry=0x0, base=base@entry=10, group=group@entry=0,
loc=0xb7f798a0 <_nl_global_locale>) at strtol_l.c:298
298 strtol_l.c: Arquivo ou diretório não encontrado.



  


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

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/05/2016 - 19:39h

Fiz questão de acertar a tabulação.
Seu programa aparentemente está correto.
Ele pesquisa números amigos.
Você sabe o que são números amigos?

Estranho que me parece a definição dada por este programa.

No caso o erro é dado quando não se passam parâmetros através da linha de comando do programa. Por exemplo, vamos chamar o programa de soma, porque eu sei que tem uma função dentro dele chamada soma e não tenho a menor ideia para o quê este programa serve. Executando o programa assim

./soma

dá erro porque o programa não tem tratamento de erro para quando não há parâmetros passados. Agora se for executado

./soma 1 500

são passados dois parâmetros: 1 e 500. E a saída do programa é

Os numeros 28 e 6 são mutuamente amigos.
Os numeros 496 e 6 são mutuamente amigos.
Os numeros 234 e 12 são mutuamente amigos.
Os numeros 496 e 28 são mutuamente amigos.
Os numeros 140 e 30 são mutuamente amigos.
Os numeros 224 e 40 são mutuamente amigos.
Os numeros 308 e 66 são mutuamente amigos.
Os numeros 364 e 78 são mutuamente amigos.
Os numeros 200 e 80 são mutuamente amigos.
Os numeros 270 e 84 são mutuamente amigos.
Os numeros 476 e 102 são mutuamente amigos.


Você precisaria tratar o programa com prevenção de erros como

* digitar nada na entrada
* digitar apenas um parâmetro
* digitar mais de dois parâmetros
* digitar coisas que não sejam números
* digitar valores negativos (há um cálculo de raiz quadrada no programa)
* digitar o menor e o maior valores em posições trocadas
* e mais algo que eu possa ter me esquecido

Obs: como tudo isto é trabalhoso, pode-se dizer que o programa não apresentará erros do tipo dos citados acima DESDE QUE você o saiba usar e use-o corretamente. Nada de digitar letras e valores negativos e outras coisas nos lugares dos parâmetros. Então você poderá dormir sossegada com esta.

Agora, o problema sobre prá que serve o programa: não vou pesquisar, mas se não me engano, números ambos amigos possuem um a soma de divisores do outro.

E números perfeitos possuem a própria soma de divisores como seu próprio valor vezes dois. Veja se não há erro de lógica.

Agora segue o programa tabulado:

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

int somaDivisores( int valor )
{

int extra = (int) sqrt( valor ), j, divid, soma = 0;

for( j = 1; j <= extra; j++ )
{
if( valor % j == 0 )
{
divid = valor / j;

if( ( valor / j ) == j )
divid = 0;
soma += j + divid;
}
}
return soma;
}

int main( int argc, char **argv )
{

double fracaoA;
int minimo = atoi( argv[1] );
int maximo = atoi( argv[2] );
int range = maximo - minimo;
double amigos[ range ];
int i,j;

for( j = minimo; j <= maximo; j++ )
{
fracaoA = (double) somaDivisores( j ) / j;
amigos[ j - minimo ] = fracaoA;
}

for( i = 0; i <= range; i++ )
{
for( j = i + 1; j <= range; j++ )
{
if( amigos[ i ] == amigos[ j ] )
{
printf( "Os numeros %d e %d são mutuamente amigos.\n",
( minimo + j ), ( minimo + i ) );
}
}
}

return 0;
}


----------------------------------------------------------------------------------------------------------------
# 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)

wivia
Wivia

(usa CentOS)

Enviado em 15/05/2016 - 20:17h

Estou fazendo em cima do enunciado do professor acho todos os divisores de um números os somo, e divido essa soma o numero base.
Agradeço vou pesquisar essas tratativas só as vi em java.

Mas obrigada
:)


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

wivia
Wivia

(usa CentOS)

Enviado em 15/05/2016 - 20:21h

Mas consegues me auxiliar em colocar pra rodar acrescentei o scan para ter a entrada o professor a principio não vai cobrar tratativas, é que tenho que fazer esse código de forma sequencial e depois com threads.

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

int i,j, minimo, maximo;

int somaDivisores( int valor )
{

int extra = (int) sqrt( valor ), j, divid, soma = 0;

for( j = 1; j <= extra; j++ )
{
if( valor % j == 0 )
{
divid = valor / j;

if( ( valor / j ) == j )
divid = 0;
soma += j + divid;
}
}
return soma;
}

int main( int argc, char **argv )
{


printf("Minimo: ");
scanf("%d",&minimo);
printf("Maximo: ");
scanf("%d",&maximo);

double fracaoA;
minimo = atoi( argv[1] );
maximo = atoi( argv[2] );
int range = maximo - minimo;
double amigos[ range ];

for( j = minimo; j <= maximo; j++ )
{
fracaoA = (double) somaDivisores( j ) / j;
amigos[ j - minimo ] = fracaoA;
}

for( i = 0; i <= range; i++ )
{
for( j = i + 1; j <= range; j++ )
{
if( amigos[ i ] == amigos[ j ] )
{
printf( "Os numeros %d e %d são mutuamente amigos.\n",
( minimo + j ), ( minimo + i ) );
}
}
}

return 0;
}



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

wivia
Wivia

(usa CentOS)

Enviado em 15/05/2016 - 20:35h

Consegui obrigada






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts