"Segmentation faul" [RESOLVIDO]

1. "Segmentation faul" [RESOLVIDO]

samuel ribeiro
samuelfd

(usa Ubuntu)

Enviado em 17/10/2014 - 13:17h

Alguem poderia me ajudar nesse algoritmo, o algoritmo a baixo tem a função de fazer conversoes de bases 2-8-10-16 para base 2-8-10 e 16 mais quando e feita de qualquer base para a base 16 ele encerra o programa com a mensagem "Segmentation faul" poderiam me auxiliar ?

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main () {
int base_atual,base_saida,cont_i,tamanho,soma,d,z,cont,restart=1,j;
//base_atual "essa variavel responsavel por receber a base de origem"
//base_saida "essa variavel responsavel por receber a base de saida"
//cont_i "essa variavel responsavel por contar"
//tamanho "essa variavel responsavel por contar quantos digitos tem o numero a ser convertido"
//soma "essa variavel responsavel por somar o numeros depois de convertido para gerar o numeor em decimal"
//d "essa variavel responsavel por receber a divisao do numero somado divido pela base de saida"
//z "essa variavel responsavel por contar"
//cont "essa variavel responsavel por contar"
//restart "essa variavel responsavel por reniciar o programa"
double m;
char vetor[1000], vetor2 [1000];
int vetor3 [10000];
while(restart!=0){
j=0;
soma=0;
d=0;
//"esse trecho do programa e responsavel por receber os dados do usuario, e lhe informar quais digitos podem ser inseridos de acordo com a base digitada."
printf("Digite a base atual(2-8-10-16)\n");
scanf("%d",&base_atual);

if(base_atual==2){
printf("\nEssa base so aceita numeros de 0 a 1\n\n");
}
if(base_atual==4){
printf("\nEssa base so aceita numeros de 0 a 3\n\n");
}
if(base_atual==8){
printf("\nEssa base so aceita numeros de 0 a 7\n\n");
}
if(base_atual==10){
printf("\nEssa base so aceita numeros de 0 a 9\n\n");
}
if(base_atual==16){
printf("\nEssa base so aceita numeros de 0 a 9 e somente letras maiusculas A-F,\n\n");
}
printf("Digite o numero a ser convertido\n");
gets(vetor);
gets(vetor);
tamanho=strlen(vetor);
cont=tamanho;
//"esse trecho e responsavel por converte de qualquer base de entrada para a base decimal."
if(base_atual==16){
cont_i=0;
while(cont_i<tamanho){
if(vetor[cont_i]==65+j){
if(vetor[cont_i]<=70){
vetor[cont_i]=10+j;
cont_i++;
j=0;
}
}
if(vetor[cont_i]==48+j && vetor[cont_i]<58){
vetor[cont_i]=0+j;
j=0;
cont_i++;
}
j++;
}
for(cont_i=0;cont_i<tamanho;cont_i++){
int posicao=vetor[cont_i];
m=posicao*pow(base_atual,cont);
cont--;
soma=soma+m;
}
}

if(base_atual!=16){
for(cont_i=0;cont_i<tamanho;cont_i++){
int posicao=vetor[cont_i]-48;
m=posicao*pow(base_atual,cont);
cont--;
soma=soma+m;
}
}
//esse trecho do programa e responsavel por converte da base decimal ja convertida anteriomente para base de saida de 2 a 10 e 16"
printf("Digite a base a ser convertida\n");
scanf("%d",&base_saida);
cont_i=0;
soma=soma/base_atual;
z=soma;
if(soma<base_saida && base_saida!=16){
printf("O numero na base %d e : %d",base_saida,soma);
}
if(soma>=base_saida || base_saida==16){

while(soma>=base_saida || base_saida==16){
d=soma/base_saida;
vetor[cont_i]=soma%base_saida;
soma=d;
cont_i++;
}}
vetor[cont_i]=d;

//"esse trecho e responsavel por imprimir o resultado depois de feito a conversao desejada"
if(z>=base_saida || base_saida==16){
printf("O numero na base %d convertido pra base %d e :\t",base_atual,base_saida);
while(cont_i>=0){
if(base_saida==16){
if(vetor[cont_i]==10){
vetor2[cont_i]='A';
printf("%c",vetor2[cont_i]);
}
if(vetor[cont_i]==11){
vetor2[cont_i]='B';
printf("%c",vetor2[cont_i]);
}
if(vetor[cont_i]==12){
vetor2[cont_i]='C';
printf("%c",vetor2[cont_i]);
}
if(vetor[cont_i]==13){
vetor2[cont_i]='D';
printf("%c",vetor2[cont_i]);
}
if(vetor[cont_i]==14){
vetor2[cont_i]='E';
printf("%c",vetor2[cont_i]);
}
if(vetor[cont_i]==15){
vetor2[cont_i]='F';
printf("%c",vetor2[cont_i]);
}
if(vetor[cont_i]==0){
vetor3[cont_i]=0;
printf("%d",vetor3[cont_i]);
}
if(vetor[cont_i]==1){
vetor3[cont_i]=1;
printf("%d",vetor3[cont_i]);
}
if(vetor[cont_i]==2){
vetor3[cont_i]=2;
printf("%d",vetor3[cont_i]);
}
if(vetor[cont_i]==3){
vetor3[cont_i]=3;
printf("%d",vetor3[cont_i]);
}
if(vetor[cont_i]==4){
vetor3[cont_i]=4;
printf("%d",vetor3[cont_i]);
}
if(vetor[cont_i]==5){
vetor3[cont_i]=5;
printf("%d",vetor3[cont_i]);
}
if(vetor[cont_i]==6){
vetor3[cont_i]=6;
printf("%d",vetor3[cont_i]);
}
if(vetor[cont_i]==7){
vetor3[cont_i]=7;
printf("%d",vetor3[cont_i]);
}
if(vetor[cont_i]==8){
vetor3[cont_i]=8;
printf("%d",vetor3[cont_i]);
}
if(vetor[cont_i]==9){
vetor3[cont_i]=9;
printf("%d",vetor3[cont_i]);
}}
if(base_saida!=16){
printf("%d",vetor[cont_i]);
}
cont_i--;
}}
//"esse trecho e responsavel por perguntar o usuario se deseja fazer uma nova conversão"
printf("\n\nDeseja fazer outra conversao?\nse sim digite1\nse nao digite 0\n");
scanf("%d",&restart);

}
printf("\nObrigado por usar minha calculadora\n");
printf("Programa Desenvlovido Por: Samuel Ribeiro Rodrigues\nAluno do curso de ciência da computacão da Universidade Federal De São João del Rei \nVersão: 1.0");
return 0;
}


  


2. Re: "Segmentation faul" [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 17/10/2014 - 14:03h

Amigo ,o problema está no seu "vetor[cont_i]=(soma%base_saida); "

Ainda nao encontrei o problema , pois codigo des-identado é "feio"

Se possivel , aperte tab (fica a dica)




3. Re: "Segmentation faul" [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 17/10/2014 - 14:15h

Se importaria se eu re-escrever esse programa usando funcoes?

[]'s

T+


4. Re: "Segmentation faul" [RESOLVIDO]

samuel ribeiro
samuelfd

(usa Ubuntu)

Enviado em 17/10/2014 - 14:16h

Desculpa pela indentação, mais por que quando posto aqui sai do formato, mais por uqe esse erro acontece so com o a base 16?


5. Re: "Segmentation faul" [RESOLVIDO]

samuel ribeiro
samuelfd

(usa Ubuntu)

Enviado em 17/10/2014 - 14:24h

ate nao importaria, mas esse programa e pra um trabalho da faculdade como estou no primeiro periodo nao poderia entregar um programa com funções, ate iria afzer com funções que ja conhecia algumas mais o professor nao autorizou :\


6. Re: "Segmentation faul" [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 17/10/2014 - 19:06h

Amigo , o seu problema já está resolvido ?

Pq eu achei o erro

Se quiser ainda a minha ajuda , fico a dispor

[]'s

T+


7. Re: "Segmentation faul" [RESOLVIDO]

samuel ribeiro
samuelfd

(usa Ubuntu)

Enviado em 17/10/2014 - 23:24h

olha descobrir sim, mais poderia me falar seu ponto de vista qual seria o concerto e bom se acontecer isso novamente em outro algoritmo aprendi algumas soluções sua ideia sera bem vinda


8. Re: "Segmentation faul" [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 17/10/2014 - 23:35h

Amigo ,o problema na vdd era que acontecia estouro do vetor , por isso dava falha de segmentacao

Eu identei ,corrigi e melhorei o seu codigo

Espero que goste


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

/*
*
* Cara , se ajudei , nao pegue simplesmente o codigo e entregue
* Tente entender o que eu fiz
* Espero ter ajudado
* Escolha a melhor resposta
* []'s
* T+
*/



int main () {
int base_atual,base_saida,cont_i,tamanho,soma,d,z,cont,restart=1,j;
double m;
char vetor[1000], vetor2 [1000];
int vetor3 [10000];
do{
system("clear||cls");
j=0;
soma=0;
d=0;
printf("Digite a base atual(2-4-8-10-16)\n");
scanf("%d",&base_atual);
getchar();

if(base_atual==2){
printf("\nEssa base so aceita numeros de 0 a 1\n\n");
}else if(base_atual==4){
printf("\nEssa base so aceita numeros de 0 a 3\n\n");
}else if(base_atual==8){
printf("\nEssa base so aceita numeros de 0 a 7\n\n");
}else if(base_atual==10){
printf("\nEssa base so aceita numeros de 0 a 9\n\n");
}else if(base_atual==16){
printf("\nEssa base so aceita numeros de 0 a 9 e somente letras maiusculas A-F,\n\n");
}else{
printf("Base Invalida !\n");
continue;
}

printf("Digite o numero a ser convertido\n");
fgets(vetor,sizeof(vetor),stdin);
tamanho=strlen(vetor);
cont=tamanho;

if(base_atual==16){
for(cont_i=0;cont_i<tamanho;cont_i++){
if(vetor[cont_i]==65+j){
if(vetor[cont_i]<=70){
vetor[cont_i]=10+j;
j=0;
}
}else if(vetor[cont_i]==48+j && vetor[cont_i]<58){
vetor[cont_i]=0+j;
j=0;
}
j++;
}
for(cont_i=0;cont_i<tamanho;cont_i++){
int posicao=vetor[cont_i];
m=posicao*pow(base_atual,cont);
cont--;
soma+=m;
}
}else if(base_atual!=16){
for(cont_i=0;cont_i<tamanho;cont_i++){
int posicao=vetor[cont_i]-48;
m=posicao*pow(base_atual,cont);
cont--;
soma+=m;
}
}

printf("Digite a base a ser convertida\n");
scanf("%d",&base_saida);
cont_i=0;
soma/=base_atual;
z=soma;

if(soma<base_saida && base_saida!=16){
printf("O numero na base %d e : %d",base_saida,soma);
}else if(soma>=base_saida || base_saida==16){
do{
d=soma/base_saida;
vetor[cont_i]=soma%base_saida;
soma=d;
cont_i++;
}while((soma>=base_saida || base_saida==16) && ((unsigned)cont_i < sizeof(vetor)));
}

vetor[cont_i]=d;

if(z>=base_saida || base_saida==16){
printf("O numero na base %d convertido pra base %d e :\t",base_atual,base_saida);
do{
if(base_saida==16){
switch(vetor[cont_i]){
case 0:
vetor3[cont_i]=0;
printf("%d",vetor3[cont_i]);
break;
case 1:
vetor3[cont_i]=1;
printf("%d",vetor3[cont_i]);
break;
case 2:
vetor3[cont_i]=2;
printf("%d",vetor3[cont_i]);
break;
case 3:
vetor3[cont_i]=3;
printf("%d",vetor3[cont_i]);
break;
case 4:
vetor3[cont_i]=4;
printf("%d",vetor3[cont_i]);
break;
case 5:
vetor3[cont_i]=5;
printf("%d",vetor3[cont_i]);
break;
case 6:
vetor3[cont_i]=6;
printf("%d",vetor3[cont_i]);
break;
case 7:
vetor3[cont_i]=7;
printf("%d",vetor3[cont_i]);
break;
case 8:
vetor3[cont_i]=8;
printf("%d",vetor3[cont_i]);
break;
case 9:
vetor3[cont_i]=9;
printf("%d",vetor3[cont_i]);
break;
case 10:
vetor2[cont_i]='A';
printf("%c",vetor2[cont_i]);
break;
case 11:
vetor2[cont_i]='B';
printf("%c",vetor2[cont_i]);
break;
case 13:
vetor2[cont_i]='C';
printf("%c",vetor2[cont_i]);
break;
case 14:
vetor2[cont_i]='D';
printf("%c",vetor2[cont_i]);
break;
case 15:
vetor2[cont_i]='E';
printf("%c",vetor2[cont_i]);
break;
case 16:
vetor2[cont_i]='F';
printf("%c",vetor2[cont_i]);
break;

default:
break;
}
}else if(base_saida!=16){
printf("%d",vetor[cont_i]);
}
cont_i--;
}while(cont_i>=0);
}

printf("\n\nDeseja fazer outra conversao?\nSim ?\tDigite 1\nNão ?\tDigite 0\n:");
scanf("%d",&restart);
}while(restart==1);

printf("\nObrigado por usar minha calculadora\n");
printf("Programa Desenvlovido Por: Samuel Ribeiro Rodrigues e Aprimorado,Configurado,Identado e Arrumado por : Thiago \nAluno do curso de ciência da computacão da Universidade Federal De São João del Rei \nVersão: 1.0");

return 0;
}



Espero ter ajudado

Marque a Melhor resposta

[]'s

T+


9. Re: "Segmentation faul" [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/10/2014 - 23:56h

Eu nunca vi uma conversão tão complicada. E ainda dá resultados errados (por exemplo: se eu converter 2 da base 10 para própria base 10, dá -18 com resultado!).

Eis como eu faria.

const size_t max_str=40;

char str_orig[max_str], str_dest[max_str];
int base_orig, base_dest;
int valor;
char *fim;

/* Lê base_orig, str_orig e base_dest */

valor=strtol(str_orig, &fim, base_orig);
if(str_orig[0]==0 || *fim!=0){
/* str_orig tem um número inválido. Trata o erro. */
}

/* Ver http://unixntools.blogspot.com.br/2013/10/tunel-do-tempo-funcao-itoa.html */
if(my_itoa(valor, str_dest, max_str, base_dest)==NULL){
/* Conversão falhou. Trata o erro. */
}

/* Imprime str_dest, que contém o resultado da conversão. */







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts