gRoOvE 0 Denunciar post Postado Maio 21, 2010 Estou com dificuldades em alocar a memória dentro de uma função, seguem os dados: /********************************************************************************* Sistema Estudo de Caso Biblioteca Programa ler Função: Modulo para ler informacoes do arquivo Desenvolvedor - Kauan Mocelin Data Desenvolvimento: Obsevação: **********************************************************************************/ void ler(materialLivro** livro, int* num) { char linhaArquivo[sizeof(materialLivro)]; char* parsing; char matriz[10][60]; //matriz[0] = cod, matriz[1] = nome, matriz[2] = qtdExemplares int cont = 0; //Abre arquivo para leitura FILE* arquivo; arquivo = fopen("arquivo.txt","r"); if(arquivo == NULL) { printf("ERRO AO ABRIR ARQUIVO OU ARQUIVO VAZIO\n\n"); return; } //Realiza leitura do arquivo, linha por linha, faz o parsing e salva em um array while(!(feof(arquivo))) { fgets(linhaArquivo,(sizeof(materialLivro)),arquivo); parsing = strtok(linhaArquivo,";"); while(parsing != NULL) { strcpy(matriz[cont],parsing); parsing = strtok(NULL,";"); cont++; } (*num)++; } (*num)--; //Desconsiderar a última linha, a qual esta em branco //Aloca a memoria necessaria para armazenar os dados do arquivo *livro = (materialLivro *) malloc((sizeof(materialLivro)) * (*num)); if(*livro == NULL) { printf("\nNAO FOI POSSIVEL ALOCAR MEMORIA"); exit(EXIT_FAILURE); } //copia o conteudo do array para a estrutura de dados for(cont=0;cont<(*num);cont++) { strcpy(&(*livro)[cont].cod,matriz[cont*3]); strcpy(&(*livro)[cont].nome,matriz[cont*3+1]); strcpy(&(*livro)[cont].qtdExemplares,matriz[cont*3+2]); } //free(*livro); fclose(arquivo); } Estou entrando com os seguintes parâmetros nesta função: materialLivro* livro = NULL; int num=0; //chama o módulo de leitura do arquivo ler(&livro,&num); Quando executo a função está retornando falha de segmentação, ou seja, problemas com a memória =// Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 21, 2010 Foi ver no depurador? Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Maio 21, 2010 Não, hehe. Instalei o codeblocks a pouco tempo e não consegui usar o debugger dele ainda, dá pau, trava..sem falar que quando tento abrir as windows com as opções do debugger elas ficam se a borda da janela, nao consigo arrastar, fazer nada, fica td no canto da tela...tentei alterar meu gerenciador de janelas do emerald pro gtk mas adiantou nada "/ Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 21, 2010 Espalhar puts no código também ajuda a identificar erros... Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Maio 21, 2010 Sim, eu fiz isso mas não consegui identificar o erro..tipo, dentro da função ler roda certinho..mas quando volto pra função que chamou da falha de segmentação "/ Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Maio 21, 2010 Olhando assim por cima, não pode me dar uma dica? :D Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 21, 2010 Sim, eu fiz isso mas não consegui identificar o erro..tipo, dentro da função ler roda certinho..mas quando volto pra função que chamou da falha de segmentação Olhando assim por cima, não pode me dar uma dica? Você tem o código inteiro. É mais fácil você fazer isso que eu pegar esse pedaço e tentar adivinhar se é dentro da função ou fora dela. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Maio 22, 2010 o erro ta dentro desse trecho: while(!(feof(arquivo))) { linhaArquivo = (char *)malloc(sizeof(materialLivro)); if(linhaArquivo == NULL) exit(1); fgets(linhaArquivo,(sizeof(materialLivro)),arquivo); parsing = strtok(linhaArquivo,";"); while(parsing != NULL) { strcpy(matriz[cont],parsing); parsing = strtok(NULL,";"); cont++; } (*num)++; free(linhaArquivo); } ta dando isso: Program received signal SIGBUS, Bus error. obterConsultaEmprestimo () at /home/kauan/Documentos/Biblioteca/obterConsultaEmprestimo.c:31 31 for(cont=0;cont<num;cont++) Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Maio 22, 2010 Antes de mais, com certeza o erro não foi nesse trecho do código... O erro aconteceu na linha 31 do arquivo obterConsultaEmprestimo.c, mais especificamente na linha onde há: for(cont = 0; cont < num; cont++) O sinal SIGBUS denota um erro no bus do sistema, isto é ou você está tentando escrever onde não existe ou é um erro do hardware. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 22, 2010 Como o Victor já disse, sigbus, além de poder indicar uma escrita num lugar inexistente (endereço físico), também pode ser causado por um alinhamento inválido de memória. An example of an application that might handle SIGBUS is a debugger, which might check the signal stack and inform the developer of what happened, and where the program terminated. Mais uma vez...GDB. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Maio 22, 2010 Sei lah cara, não faz sentido isso..nao to fazendo nda na função obterConsultaEmprestimo..só mostrando oq jah foi colocado na variável livro dentro da função ler.. então...o gdb da o erro quando to executando aquele trecho do código, nao tem nda a ver com a função obterConsultaEmprestimo.. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 23, 2010 Se não tem nada a ver com a função que você postou, continue procurando a origem do erro ou poste o código inteiro, porque só com esse pedaço vai ser impossível alguém falar algo. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Maio 23, 2010 Consegui resolver, o problema estava aqui: char matriz[10][60]; //matriz[0] = cod, matriz[1] = nome, matriz[2] = qtdExemplares Compartilhar este post Link para o post Compartilhar em outros sites