Ir para conteúdo

POWERED BY:

Arquivado

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

gRoOvE

[Resolvido] Alocação dinamica de structs dentro de função

Recommended Posts

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

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

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

Olhando assim por cima, não pode me dar uma dica? :D

Compartilhar este post


Link para o post
Compartilhar em outros sites
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

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

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

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

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

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

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

×

Informação importante

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