Urgente - ERRO de Segmentação [RESOLVIDO]

1. Urgente - ERRO de Segmentação [RESOLVIDO]

Felipe
fbbnenas

(usa Ubuntu)

Enviado em 07/12/2008 - 22:17h

Fala galera.
Estou necessitando com urgencia a ajuda de um progamador com experiencia boa...tenho um problema com um tp da minha facudade.Editei o arquivo e quando vou executar em determinado campo do progama(venda de produtos),o programa avisa sobre falha de segmentação! (no codigo se localiza em um swich, case '2'.) creio eu que deve ser algum problema na manipulação de membros da estrutura.codigo abaixo
Agradeço por qualquer tipo de ajuda.

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

#define TAMANMAX 20
#define MAXPRODUTS 5
#define RANDOM 4
#define RODMAX 10
#define LIM 9
#define sim 1
#define nao 0
#define P1 0.1
#define P2 0.2
#define P3 0.3
#define P4 0.4
#define P5 0.5

struct produto{
char produto[TAMANMAX] ;
int codigo;
float preco;
int desp;
}pdr[MAXPRODUTS];

void insert_pdt(int *i){
printf("CADASTRAMENTO\n");
printf("--------------\n");
printf("Nome do produto :"); scanf("%s", pdr[*i].produto);
printf("Codigo do produto :"); scanf("%d", &pdr[*i].codigo);
printf("Valor do produto :"); scanf("%f", &pdr[*i].preco);
printf("Desposição em estoque:");scanf("%d", &pdr[*i].desp);
++i;
}

void mostrar(int *j){
int i;
for(i=0; i<*j; i++){
printf("\n***PRODUTOS***\n");
if(*pdr[i].produto) printf("NUM 1 - Produto: %5s\n", pdr[i].produto);
if(pdr[i].codigo) printf("NUM 2 -Codigo: %5d\n", pdr[i].codigo);
if(pdr[i].preco) printf("NUM 3 - Preço: %5f\n", pdr[i].preco);
if(pdr[i].desp) printf("NUM 4 - Desposição: %5d\n", pdr[i].desp);
}
printf("***Pressione qualquer tecla para continuar***\n");
}

void salvar(int *j){
int i;
FILE *fp;
char progn[TAMANMAX];
printf("Insira um nome para o arquivo: ");
scanf("%s", progn);
strcat(progn,".txt");
if((fp = fopen (progn,"w"))==NULL){
printf("IMPOSSIVEL ABRIR O ARQUIVO : %s\n\a",progn);
exit(1);
}
for(i=0; i<*j; i++){
if(*pdr[i].produto) fprintf(fp, "Produto: %5s\n", pdr[i].produto);
if(pdr[i].codigo) fprintf(fp, "Codigo %5d\n", pdr[i].codigo);
if(pdr[i].preco) fprintf(fp, "Preço %5f\n", pdr[i].preco);
if(pdr[i].desp) fprintf(fp, "Desposição %5d\n", pdr[i].desp);
}
fclose(fp);
}
float desc(float val){
int enter;
float res, prctd;
srand(time(NULL));
enter = rand()%RANDOM;
if(enter == 0)
prctd = P1;
else if(enter == 1){
prctd = P2;
}
else if(enter == 2){
prctd = P3;
}
else if(enter == 3){
prctd = P4;
}
else if(enter == 4){
prctd = P5;
}
res = val*prctd;
return res;
}

main (){
FILE *file;
char opcao, opcad, continua, escolha,arqnom[TAMANMAX];
int cad, p, i,lvenda, j, num, para;
float valorp=0;
while (1){
printf(" ******************************************\n");
printf(" CORDAS DA ALEGRIA EQUIPAMENTOS DE SOM LTDA\n");
printf(" ******************************************\n");
printf("\n");
printf("SEJA BEM VINDO!\n");
printf("Voce esta sendo atendido pelo nosso servidor eletronico ALPHA12\n");
printf("\n");
printf("Selecione uma das opções abaixo: ");
printf("\n");
do{
printf("Selecione um dos campos para navegar\n");
printf("\n");
printf("TECLE 1 ou 2 ou 3\n");
printf("\n");
printf("\t\t*****************************\n");
printf("\t\t1 - Cadastramento de produtos\n\t\t2 - Compra de produto\n\t\t3 - Envio de Relatorios\n");
printf("\t\t*****************************\n");
printf("\n");
scanf("%c", &opcao);
printf("\n");
if((opcao!='1')&&(opcao!='2')&&(opcao!='3')){
printf("Opção incorreta\nFavor Inserir uma opção correta\n");
}
}while((opcao!='1')&&(opcao!='2')&&(opcao!='3'));
switch(opcao){
case '1': {
do{
printf("*************************\n");
printf("CADASTRAMENTO DE PRODUTOS\n");
printf("*************************\n");
printf("\n");
printf("TECLE M ou C ou S\n");
printf("\t\tM - Mostrar produtos cadastrados\n");
printf("\t\tC - Cadastramento de produtos\n");
printf("\t\tS - Salvar produtos cadastrados\n");
printf("\n");
scanf("%c", &opcad);
printf("\n");
if((opcad!='M')&&(opcad!='C')&&(opcad!='S')){
printf("Opção incorreta\nFavor Inserir uma opção correta\n");
}
if(opcad == 'M'){
printf("*****************\n");
printf("Lista de produtos\n");
printf("*****************\n");
printf("\n");
for(i=1;i<=MAXPRODUTS;i++)
mostrar(&i);
}
else if(opcad == 'C'){
printf("*************\n");
printf("Cadastramento\n");
printf("*************\n");
printf("\n");
for(cad=1;cad<=5;cad++)
insert_pdt(&cad);
}
else if(opcad == 'S'){
printf("SALVANDO O CADASTRAMENTO\n");
salvar(&i);
}
}while((opcad!='A')&&(opcad!='B')&&(opcad!='C'));
system("tput reset");
} break;
case '2' : {
printf("Insira um nome para o arquivo que ira enviar o relatorio de vendas\n");
scanf("%s", arqnom);
strcat(arqnom,".txt");
if((file = fopen(arqnom, "w"))==NULL){
printf("Impossivel abrir o arquivo %s\n",arqnom);
exit(2);
}
printf("*******************\n");
printf("NEGOCIAÇÃO E VENDAS\n");
printf("*******************\n");
printf("\n");
printf("Nossos pdr\n");
for(lvenda=0;lvenda<=MAXPRODUTS;lvenda++){
mostrar(&lvenda);
}
printf("Selecione um dos pdr para comprar\n");
scanf("%d", &p);
printf("TECLE UM NUMERO DE 1 A 5\n");
do{
for(j=1;j<=RODMAX;j++){
printf("%dº rodada de negociação\n", j);
fprintf(file, "%dº rodada de negociação\n", j);
printf("Por favor digite o valor que voce deseja comprar o produto\n");
fprintf(file, "Por favor digite o valor que voce deseja comprar o produto\n");
scanf("%f", valorp);
if (valorp >= (pdr[p].preco)) {
printf("%f é um bom preço!Negocio fechado!\n", valorp);
fprintf(file, "%f é um bom preço!Negocio fechado\n", valorp);
pdr[p].desp--;
exit(3);
}
else{
printf("Posso lhe vender por este preço %f\n", desc(valorp));
fprintf(file, "Posso lhe vender por este preço %f\n", desc(valorp));
printf("Deseja comprar por este preço?\n");
fprintf(file, "Deseja comprar por este preço?\n");
printf("Pressione ''s'' para sim e ''n'' para nao\n");
scanf("%c", &escolha);
escolha = getchar();
getchar();
if(escolha == 's'){
printf("Vendido pelo valor de %f\n", valorp);
fprintf(file, "Vendido pelo valor de %f\n", valorp);
pdr[p].desp--;
exit(4);
}
printf("Deseja continuar a negociar?\n");
fprintf(file, "Deseja continuar a negociar?\n");
printf("Digite ''s'' para sim e ''n''para nao\n");
scanf("%c", &continua);
continua = getchar();
getchar();
para = continua == 's' ? sim : nao;
if(j==LIM)
printf("A decima rodada será a nossa ultima rodada de negociações!\n");
}
} system("tput reset");
}while(!para);
} break;
case '3': {
printf("******************\n");
printf("ENVIO DE RELATORIO\n");
printf("******************\n");
printf("\n");
for(num=1;num<=MAXPRODUTS;num++)
mostrar(&num);
salvar(&num);
} break;
}
} fclose(file);
}


  


2. Re: Urgente - ERRO de Segmentação [RESOLVIDO]

Leonardo Macedo Cerqueira
cromado

(usa Debian)

Enviado em 07/12/2008 - 23:18h

Já fui bom nisto ; )
Esqueci tudo de C , más quero acompanhar pra ver ok.


3. Re: Urgente - ERRO de Segmentação [RESOLVIDO]

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 08/12/2008 - 00:28h

eu imagino que você esteja iniciando na programação em c. então permita-me antes de mais nada apontar algumas considerações sobre seu código como um todo, embora não seja o foco da sua questão:
a lógica e o percurso do código estão confusos, o que prejudica a legibilidade e a própria construção do mesmo. há um excesso de ponteiros desnecessários, o que por si só é uma fonte potencial de segfaults e dá margem a erros por vezes mínimos mas difíceis de se encontrar. algumas chamadas perdidas e solitárias a getchar após scanf, o que também introduz bugs nebulosos - sem contar que um código com essas características está sujeito a exploits e mutações por code injection. a usabilidade também está prejudicada pelo vai-e-vem das opções, o que nos lembra um 0800.
obs: tome os comentários acima como algo amistoso e construtivo em seus estudos :D

quanto ao segfault reportado, falta um & na linha 185:
scanf("%f", &valorp);
scanf sempre espera por um ponteiro em seus argumentos variáveis.
faça um teste e qualquer coisa volte aí.


4. Ainda irei testar hj a tarde

Felipe
fbbnenas

(usa Ubuntu)

Enviado em 08/12/2008 - 08:15h

obrigado pela ajuda, mais fiquei tao focado na manipulação do array de struct que nem reparei o scanf!Quanto ao tipo vai-vem de opções, o prog tem que ser assim mesmo.Aos comentarios,uso deles mais estava mais preocupado em apurar os erros de lógica do progama.
Obrigado pelas dicas e espero que funcione


5. mais uma

Felipe
fbbnenas

(usa Ubuntu)

Enviado em 08/12/2008 - 17:55h

necessito agora de atraves do arquivo gerado pela função "void salvar(int*j);" ler e usar seus dados na minha estrutura, ou seja, o usuario ira cadastrar apenas uma vez e salvaria o cadastro, atraves do arquivo salvo apenas carregaria os dados e executaria normalmente o programa!

codigo editado e corrigido em alguns erros.

//Laboratorio de Progrmação de Computadores I - 2/2008
//Trabalho Pratico
//Loja Virtual
//Implementação de uma loja virtual capaz de negociar preços de vendas
//com o usuário
//Autor: Felipe Godinho Correa
//Data: 07/12/2008

//Bibliotecas de funções declaradas
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // para uso da função strcat
#include <time.h> //para uso da função time(NULL)

//Macros usadas afim de evitar "numeros magicos" pelo codigo fonte
#define TAMANMAX 20
#define MAXPRODUTS 5
#define RANDOM 4
#define RODMAX 10
#define LIM 9
#define sim 1
#define nao 0
#define P1 0.01
#define P2 0.02
#define P3 0.03
#define P4 0.04
#define P5 0.05

//Declaração do vetor de estruturas para o uso no cadastramento de produtos
struct produto{
char produto[TAMANMAX] ;
int codigo;
float preco;
int desp;
}pdr[MAXPRODUTS];

//Função usada para realizar o cadastro de produtos
void insert_pdt(int *i){
printf("CADASTRAMENTO\n");
printf("--------------\n");
printf("Nome do produto :"); scanf("%s", pdr[*i].produto);
printf("Codigo do produto :"); scanf("%d", &pdr[*i].codigo);
printf("Valor do produto :"); scanf("%f", &pdr[*i].preco);
printf("Desposicao em estoque:");scanf("%d", &pdr[*i].desp);
++i;
}

//Função usada para imprimir na tela a lista de produos cadastrados
void mostrar(int *j){
int i;
for(i=1; i<*j; i++){
printf("\n***PRODUTOS***\n");
if(*pdr[i].produto) printf("NUM 1 - Produto: %5s\n", pdr[i].produto);
if(pdr[i].codigo) printf("NUM 2 -Codigo: %5d\n", pdr[i].codigo);
if(pdr[i].preco) printf("NUM 3 - Preco: %5f\n", pdr[i].preco);
if(pdr[i].desp) printf("NUM 4 - Desposicao: %5d\n", pdr[i].desp);
}
printf("***Pressione qualquer tecla para continuar***\n");
}

//Função usada para salvar a lista de produtos cadastrados
void salvar(int *j){
int i;
FILE *fp;
char progn[TAMANMAX];
printf("Insira um nome para o arquivo: ");
scanf("%s", progn);
strcat(progn,".txt"); //extenção .txt para o nome do arquivo
if((fp = fopen (progn,"w"))==NULL){ //teste para ver se foi possivel
//abrir o arquivo
printf("IMPOSSIVEL ABRIR O ARQUIVO : %s\n\a",progn);
exit(1);
}
for(i=1; i<=*j; i++){
if(*pdr[i].produto) fprintf(fp, "Produto: %5s\n", pdr[i].produto);
if(pdr[i].codigo) fprintf(fp, "Codigo %5d\n", pdr[i].codigo);
if(pdr[i].preco) fprintf(fp, "Preco %5f\n", pdr[i].preco);
if(pdr[i].desp) fprintf(fp, "Desposicao %5d\n", pdr[i].desp);
}
fclose(fp);
}

//Função desconto, o "motor principal do programa", função capaz de realizar
//descontos com o usuário atraves de testes condicionais, será usado o seu valor
//de retorno para a negociação com o usuário
float desc(float val){
int enter;
float res, prctd;
srand(time(NULL));
enter = rand()%RANDOM;
if(enter == 0)
prctd = P1;
else if(enter == 1){
prctd = P2;
}
else if(enter == 2){
prctd = P3;
}
else if(enter == 3){
prctd = P4;
}
else if(enter == 4){
prctd = P5;
}
val -= (val*prctd);
return val;
}

//INICIO DA FUÇÃO PRINCIPAL
main (){
//Declaração de arquivos e variaveis usadas durante o prgrama
FILE *file;
char opcao, opcad, continua, escolha,arqnom[TAMANMAX];
int cad, p, i,lvenda, j, num, para, contol = MAXPRODUTS;//a variavel contos 5 sera usada
//em determinada parte do programa que apresentaremos a lista de produtos
//através da função "void mostar(int *j)"
float valorp, money, value;
while (1){ //uso de um laço infinito para execução
printf(" ******************************************\n");
printf(" CORDAS DA ALEGRIA EQUIPAMENTOS DE SOM LTDA\n");
printf(" ******************************************\n");
printf("\n");
printf("SEJA BEM VINDO!\n");
printf("Voce esta sendo atendido pelo nosso servidor eletronico ALPHA12\n");
printf("\n");
printf("Selecione uma das opcoes abaixo: ");
printf("\n");
do{ //uso do laço do while para execução deste menu
printf("Selecione um dos campos para navegar\n");
printf("\n");
printf("TECLE 1 ou 2 ou 3\n");
printf("\n");
printf("\t\t*****************************\n");
printf("\t\t1 - Cadastramento de produtos\n\t\t2 - Compra de produto\n\t\t3 - Envio de Relatorios\n");
printf("\t\t*****************************\n");
printf("\n");
scanf("%c", &opcao);
printf("\n");
if((opcao!='1')&&(opcao!='2')&&(opcao!='3')){
printf("Opcao incorreta\nFavor Inserir uma opcao correta\n");
}
}while((opcao!='1')&&(opcao!='2')&&(opcao!='3'));
switch(opcao){ //uso de um switch para a execução do programa
//em diferentes campos
case '1': { //campo para manipular produtos cadastrados
do{
printf("*************************\n");
printf("CADASTRAMENTO DE PRODUTOS\n");
printf("*************************\n");
printf("\n");
printf("TECLE M ou C ou S\n");
printf("\t\tM - Mostrar produtos cadastrados\n");
printf("\t\tC - Cadastramento de produtos\n");
printf("\t\tS - Salvar produtos cadastrados\n");
printf("\n");
scanf("%c", &opcad);
printf("\n");

if(opcad == 'M'){ //opção do campo que imprime na tela a lista
// de produtos cadastrados
printf("*****************\n");
printf("Lista de produtos\n");
printf("*****************\n");
printf("\n");
mostrar(&contol);
system("pause");
return 0;
}
else if(opcad == 'C'){ //campo do programa que cadastra
//produtos para a venda a um usuario
printf("*************\n");
printf("Cadastramento\n");
printf("*************\n");
printf("\n");
for(cad=1;cad<=5;cad++)
insert_pdt(&cad);
}
else if(opcad == 'S'){ //varia usada para salvar em
//um arquivo de texto os produtos cadastrados
printf("SALVANDO O CADASTRAMENTO\n");
salvar(&contol);
return 0;
}
}while((opcad!='A')&&(opcad!='B')&&(opcad!='C'));
system("cls"); //usado pra linpar a tela
} break;
case '2' : { //campo do programa destinado a negociação de produtos
//com o usuário
printf("Insira um nome para o arquivo que ira enviar o relatorio de vendas\n");
scanf("%s", arqnom);
strcat(arqnom,".txt"); //extenção .txt para o nome do arquivo
if((file = fopen(arqnom, "w"))==NULL){ //teste se foi
//possivel abrir o arquivo
printf("Impossivel abrir o arquivo %s\n",arqnom);
exit(2);
}
printf("*******************\n");
printf("NEGOCIACAO E VENDAS\n");
printf("*******************\n");
printf("\n");
printf("Nossos Produtos\n");
mostrar(&contol);
printf("Selecione um dos pdr para comprar\n");
printf("TECLE UM NUMERO DE 1 A 5\n");
scanf("%d", &p);
printf("Voce esta comprando o produto:\n");
mostrar(&p);
money = pdr[p].preco;
do{
for(j=1;j<=RODMAX;j++){ //Inicio das negociações
printf("rodada %d de negociacao\n", j);
fprintf(file, "rodada %d de negociacao\n", j);
printf("Por favor digite o valor que voce deseja comprar o produto\n");
fprintf(file, "Por favor digite o valor que voce deseja comprar o produto\n");
scanf("%f", &valorp);

if (valorp > pdr[p].preco) { //caso o preço proposto pelo usuário
//seja maior que o valor que esta a venda, auotmaticamente
//o sistema vende para ele o produto
printf("%f e um bom preco!Negocio fechado!\n", valorp);
fprintf(file, "%f e um bom preco!Negocio fechado\n", valorp);
pdr[p].desp--;
salvar(&p);
return 0;
}
else{ // caso ele deseja por um preço menor do que o preço original,
//o sistema inicia negociações de preços com o usuário
money = desc(money); //uso da função que sera usada para decrementar
//o valor do preço no decorrer das negociações
printf("Posso lhe vender por este preco %f\n", money);
fprintf(file, "Posso lhe vender por este preco %f\n", money);
printf("Deseja comprar por este preco?\n");
fprintf(file, "Deseja comprar por este preco?\n");
printf("Pressione ''s'' para sim e ''n'' para nao\n");
scanf("%c", &escolha);
escolha = getchar();
getchar();
if(escolha == 's'){
printf("Vendido pelo valor de %f\n", money);
fprintf(file, "Vendido pelo valor de %f\n", money);
pdr[p].desp--;
salvar(&p);
return 0;
}
printf("Deseja continuar a negociar?\n");
fprintf(file, "Deseja continuar a negociar?\n");
printf("Digite ''s'' para sim e ''n''para nao\n");
scanf("%c", &continua);
continua = getchar();
getchar();
para = continua == 's' ? sim : nao;
if(j==LIM)
printf("A decima rodada sera a nossa ultima rodada de negociacoes!\n");
}
} system("cls");
}while(!para);
} break;
case '3': {
printf("******************\n");
printf("ENVIO DE RELATORIO\n");
printf("******************\n");
printf("\n");
mostrar(&contol);
salvar(&contol);
} break;
}
}
fclose(file);
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts