Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matheus Weber

Segmetation Fault

Recommended Posts

Boa noite gente, eu to estudando pra uma prova de Estrutura de Dados, mas não consigo fazer funcionar um código, ele dar o erro Segmentation Fault, alguém poderia me ajudar?


Os dois primeiros são os mais importantes, o erro dar no segundo código, na primeira função, já to há 1h trancado nisso =/


Segue abaixo o código:


#ifndef PRATICA01_H
#define PRATICA01_H

#ifdef __cplusplus
extern "C" {
#endif
#define NUM_ITENS 100

typedef struct item {
char* descricao;
int quantidade;
float preco;
} Item;

typedef struct lista {
Item* lista;
int tamanho;
} ListaItens;

int le_arquivo(char *c, ListaItens *lista);
int escreve_arquivo(char *c, ListaItens *lista);
void processa_reajuste(ListaItens *lista, float f);
void ordena_por_menor_preco(ListaItens *lista);
void ordena_por_maior_quantidade(ListaItens *lista);

#ifdef __cplusplus
}
#endif

#endif /* PRATICA01_H */




#include "pratica01.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>



int le_arquivo(char* c, ListaItens* l){
FILE *fp;
char linha[250];
char *aux;
int i;
i=0;
if((fp = fopen(c,"r"))==NULL){
printf("Arquivo não encontrado");
exit(1);
}
fp = fopen(c,"r");

while(fgets(linha,sizeof(linha),fp)!=NULL){


Item produto;
printf("7");
aux = strtok(linha,";");

produto.descricao = (char *)malloc(strlen(aux)+1);

strcpy(produto.descricao,aux);

produto.quantidade = atoi(strtok (NULL,";"));

produto.preco = atof(strtok (NULL,";"));

l->lista[i] = produto;
i++;


}
fclose(fp);
return i;






}

int escreve_arquivo(char* c, ListaItens* itens){
int i =0;
FILE *fp;
fp = fopen(c,"w");
for(i=0;i<itens->tamanho;i++){



fprintf(fp,"%s;%d;%.2f\n",itens->lista[i].descricao,itens->lista[i].quantidade,itens->lista[i].preco);



}
fclose(fp);
return i;


}

void processa_reajuste(ListaItens* itens, float f){
int i =0;
for(i=0;i<itens->tamanho;i++){
/*Item it;
it = itens->lista[i];
it.preco = it.preco+((f/100.0)*it.preco);
itens->lista[i]=it;
Minha versão*/
itens->lista[i].preco*=(f/100)+1;
}


}

void ordena_por_menor_preco(ListaItens* itens){
int i =0;
int j =0;
Item it;
for(i=0;i<itens->tamanho;i++){
for(j=0;j<itens->tamanho;j++){
if(itens->lista[i].preco<itens->lista[j].preco){
it = itens->lista[j];
itens->lista[j] = itens->lista[i];
itens->lista[i] = it;
}
}


}

}

void ordena_por_maior_quantidade(ListaItens* itens){
int i =0;
int j =0;
Item it;
for(i=0;i<itens->tamanho;i++){
for(j=0;j<itens->tamanho;j++){
if(itens->lista[i].quantidade>itens->lista[j].quantidade){
it = itens->lista[j];
itens->lista[j] = itens->lista[i];
itens->lista[i] = it;
}
}


}

}



#include "pratica01.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv) {
if (argc < 4 || argc > 5) {
printf("Erro: Numero de parametros invalido!\n");
printf("Sintaxe: main_p01 <nome_do_arquivo_de_entrada> <nome_do_arquivo_de_saida><percentual_de_reajuste> [-op | -oq]\n");
printf("Opcoes:\n");
printf("-op = ordena por menor preco\n");
printf("-oq = ordena por maior quantidade\n");
return 1;
}
ListaItens itens;
float perc = atof(argv[3]);
if (argc == 4) {
int num = le_arquivo(argv[1], &itens);
if (num) {
itens.tamanho = num;
processa_reajuste(&itens, perc);
escreve_arquivo(argv[2], &itens);
} else {
printf("Erro: Nao foi possivel ler nenhum registro de item.\n");
return 1;
}
} if (argc == 5) {
if (strcmp(argv[4], "-op") == 0 || strcmp(argv[4], "-oq") == 0) {
int num = le_arquivo(argv[1], &itens);
if (num) {
itens.tamanho = num;
processa_reajuste(&itens, perc);
if (strcmp(argv[4], "-op") == 0) {
ordena_por_menor_preco(&itens);
} else if (strcmp(argv[4], "-oq") == 0) {
ordena_por_maior_quantidade(&itens);
}
escreve_arquivo(argv[2], &itens);
} else {
printf("Erro: Nao foi possivel ler nenhum registro de item.\n");
return 1;
}
} else {
printf("Erro: Opcao '%s' invalida!\n", argv[4]);
return 1;
}
}
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei em que ambiente você está programando, mas te ensinaram a usar depurador?

Se for no Linux, o GCC tem uma flag -g que, após a compilação, gera um executável que pode ser depurado via GDB (a grosso modo é isso).

 

A falha de segmentação acontece em l->lista = produto. Perceba que vc não alocou espaço.

 

Se eu colocar o seguinte na funcao de leitura do código, a falha de segmentação "deixa de existir":

 

 

l->lista = (Item *)malloc(sizeof(Item *));
 
while(....) {
  (...)
   l->lista = (Item *)realloc(l->lista, (i+1)* sizeof(Item *));
 
   l->lista[i] = produto;
   i++;
(...)
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Não sei em que ambiente você está programando, mas te ensinaram a usar depurador?

Se for no Linux, o GCC tem uma flag -g que, após a compilação, gera um executável que pode ser depurado via GDB (a grosso modo é isso).

 

A falha de segmentação acontece em l->lista = produto. Perceba que vc não alocou espaço.

 

Se eu colocar o seguinte na funcao de leitura do código, a falha de segmentação "deixa de existir":

 

 

l->lista = (Item *)malloc(sizeof(Item *));
 
while(....) {
  (...)
   l->lista = (Item *)realloc(l->lista, (i+1)* sizeof(Item *));
 
   l->lista[i] = produto;
   i++;
(...)
}

 

Boa noite, eu aloquei do jeito que tu disse, mas agora dar outro erro

 

======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:05 668554     /home/matheus/Desktop/Faculdade/ED1/Projeto1/main_p01
0804a000-0804b000 r--p 00001000 08:05 668554     /home/matheus/Desktop/Faculdade/ED1/Projeto1/main_p01
0804b000-0804c000 rw-p 00002000 08:05 668554     /home/matheus/Desktop/Faculdade/ED1/Projeto1/main_p01
08d38000-08d59000 rw-p 00000000 00:00 0          [heap]
b756c000-b7588000 r-xp 00000000 08:05 263050     /lib/i386-linux-gnu/libgcc_s.so.1
b7588000-b7589000 r--p 0001b000 08:05 263050     /lib/i386-linux-gnu/libgcc_s.so.1
b7589000-b758a000 rw-p 0001c000 08:05 263050     /lib/i386-linux-gnu/libgcc_s.so.1
b759d000-b759e000 rw-p 00000000 00:00 0 
b759e000-b7741000 r-xp 00000000 08:05 263025     /lib/i386-linux-gnu/libc-2.15.so
b7741000-b7742000 ---p 001a3000 08:05 263025     /lib/i386-linux-gnu/libc-2.15.so
b7742000-b7744000 r--p 001a3000 08:05 263025     /lib/i386-linux-gnu/libc-2.15.so
b7744000-b7745000 rw-p 001a5000 08:05 263025     /lib/i386-linux-gnu/libc-2.15.so
b7745000-b7748000 rw-p 00000000 00:00 0 
b775a000-b775d000 rw-p 00000000 00:00 0 
b775d000-b775e000 r-xp 00000000 00:00 0          [vdso]
b775e000-b777e000 r-xp 00000000 08:05 263003     /lib/i386-linux-gnu/ld-2.15.so
b777e000-b777f000 r--p 0001f000 08:05 263003     /lib/i386-linux-gnu/ld-2.15.so
b777f000-b7780000 rw-p 00020000 08:05 263003     /lib/i386-linux-gnu/ld-2.15.so
bfcfd000-bfd1e000 rw-p 00000000 00:00 0          [stack]
Aborted (core dumped)
matheus@matheus-GA-78LMT-S2P:~/Desktop/Faculdade/ED1/Projeto1$ ./main_p01 entrada.txt saida.txt 10 -op
*** glibc detected *** ./main_p01: realloc(): invalid next size: 0x08d8c2d8 ***

 

Pelo visto eu to tentando alocar em algum lugar que não dar né?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, saiu coisa ali que não devia enquanto digitava. No realloc, ao invés de usar sizeof(Item *), é sizeof(Item).

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.