Trinkes Posted May 20, 2013 at 09:32 PM Report #508139 Posted May 20, 2013 at 09:32 PM (edited) Boa noite Estou a começar a desenvolver um projecto que consiste na organização de um armazém. Os dados são guardados em ficheiros, logo tenho de fazer a leitura dos mesmos. Tentei fazer um teste a ler um produto do ficheiro(binario) e estou a obter um erro que penso que tem origem nas passagens por argumento das estruturas. deixo aqui o código: #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { int ref; int quantidade_stock; }Produtos ; void le_dados(Produtos *produtos,int *narm,int *ncor); void main(){ int narm=0,ncor=0; Produtos *arm=NULL; le_dados(arm,&narm,&ncor); printf("%d",(arm->quantidade_stock)); } void le_dados(Produtos *arm,int *narm,int *ncor){ int i,n,qnt_pro; FILE *f; f=fopen("retail.bin","rb"); if(f==NULL) printf("erro ao abrir o ficheiro"); else{ fread(ncor,sizeof (int),1,f); fread(narm,sizeof (int),1,f); fread(&qnt_pro,sizeof (int),1,f); arm = (Produtos*) malloc(sizeof(Produtos) * qnt_pro); fread((&arm->quantidade_stock),sizeof (int),1,f); fread((&arm->ref),sizeof (int),1,f); } } Se me podessem ajudar agradecia. Já agora, há alguma forma de por o código formatado automaticamente aqui no forum? Obrigado Edited May 20, 2013 at 09:52 PM by pmg GeSHi
HappyHippyHippo Posted May 20, 2013 at 09:42 PM Report #508141 Posted May 20, 2013 at 09:42 PM qual o erro que aparece ? --- automaticamente não, tens de ter o código formatado correctamente e copiar para aqui no modo de edição simples (primeiro botão do editor) e já agora, usa o tag da linguagem de programação usado, neste caso : C [ code=c] // ... [ /code] (sem espaços claro) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Trinkes Posted May 20, 2013 at 09:48 PM Author Report #508143 Posted May 20, 2013 at 09:48 PM qual o erro que aparece ? --- automaticamente não, tens de ter o código formatado correctamente e copiar para aqui no modo de edição simples (primeiro botão do editor) e já agora, usa o tag da linguagem de programação usado, neste caso : C [ code=c] // ... [ /code] (sem espaços claro) Obrigado, não sabia dessa tag. Quanto ao erro não há muito a dizer pois apenas aparece que deixou de funcionar. O erro aparece quanto, na função main, tento aceder aos dados da estrutura lida na função "le_dados". Verifiquei isso porque quando tiro o printf da função main corre tudo bem(suspeito que os valores da estrutura não chegam correctos à função main).
pmg Posted May 20, 2013 at 09:56 PM Report #508146 Posted May 20, 2013 at 09:56 PM (edited) Aqui! Produtos *arm=NULL; le_dados(arm,&narm,&ncor); Ao passares arm para a funcao le_dados(), o valor dessa variavel nao se altera (fica sempre NULL). Tens de passar o endereco do apontador (e fazer as alteracoes necessarias ao codigo) Produtos *arm=NULL; le_dados(&arm,&narm,&ncor); /* ^ endereco do apontador */ Edited May 20, 2013 at 09:56 PM by pmg What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
HappyHippyHippo Posted May 20, 2013 at 09:57 PM Report #508147 Posted May 20, 2013 at 09:57 PM int main() { // ... Produtos * arm = NULL; // valor guardado na variável "arm" == NULL le_dados(arm, &narm, &ncor); // estás a passar o valor da variável "arm" == NULL printf("%d", arm->quantidade_stock); // valor guardado na variável "arm" == NULL return 0; } void le_dados(Produtos * arm, int * narm, int * ncor) { // "arm" é uma variável local com o valor passado como argumento da função == "NULL" // ... arm = (Produtos*) malloc(sizeof(Produtos) * qnt_pro); // a variável local tem agora o valor retornado pela função malloc fread((&arm->quantidade_stock),sizeof (int),1,f); // sem problemas, estás a usar o valor da posição de memória alocada fread((&arm->ref),sizeof (int),1,f); // sem problemas, estás a usar o valor da posição de memória alocada // ... fclose(f); // fecha o ficheiro !!!!! } tens duas soluções : - ou retornas o ponteiro/valor da posição de memória alocada - passas a referência da variável em vez do seu valor: solução 1: Produtos * le_dados(Produtos * arm, int * narm, int * ncor) { // ... return arm; } int main() { arm = le_daddos(...); } solução 2: void le_dados(Produtos ** arm, int * narm, int * ncor) { // ... // tens de alterar as indireções à variável arm } int main() { le_daddos(&arm, ...); } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Trinkes Posted May 20, 2013 at 10:28 PM Author Report #508151 Posted May 20, 2013 at 10:28 PM (edited) Obrigado! Não tinha percebido isso.eu achei que como passava o ponteiro por endereço, ele também se alterava no main quando fazia o malloc...-_-' o código ficou assim: #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { int ref; int quantidade_stock; }Produtos ; Produtos* le_dados(Produtos *produtos,int *narm,int *ncor); void main(){ int narm=0,ncor=0; Produtos *arm=NULL; arm=le_dados(arm,&narm,&ncor); printf("%d",(arm->quantidade_stock)); } Produtos* le_dados(Produtos *arm,int *narm,int *ncor){ int i,n,qnt_pro; FILE *f; f=fopen("retail.bin","rb"); if(f==NULL) printf("erro ao abrir o ficheiro"); else{ fread(ncor,sizeof (int),1,f); fread(narm,sizeof (int),1,f); fread(&qnt_pro,sizeof (int),1,f); arm = (Produtos*) malloc(sizeof(Produtos) * qnt_pro); fread((&arm->quantidade_stock),sizeof (int),1,f); fread((&arm->ref),sizeof (int),1,f); } return arm; } Mais uma questão: -O malloc como está gera um array de produtos do tamanho qnt_pro certo? Aqui! Ao passares arm para a funcao le_dados(), o valor dessa variavel nao se altera (fica sempre NULL). Tens de passar o endereco do apontador (e fazer as alteracoes necessarias ao codigo) Produtos *arm=NULL; le_dados(&arm,&narm,&ncor); /* ^ endereco do apontador */ Dessa maneira não deu, aparecia este erro: Unhandled exception at 0x773815de in Trabalho Pratico.exe: 0xC0000005: Access violation reading location 0x00000000. não estava a ler no sitio certo da memória. de qualquer forma obrigado!🙂 Edited May 20, 2013 at 10:28 PM by Trinkes
Trinkes Posted May 21, 2013 at 11:04 AM Author Report #508188 Posted May 21, 2013 at 11:04 AM Mais uma questão: -O malloc como está gera um array de produtos do tamanho qnt_pro certo? Ninguém sabe?=x
HappyHippyHippo Posted May 21, 2013 at 11:10 AM Report #508189 Posted May 21, 2013 at 11:10 AM Mais uma questão: -O malloc como está gera um array de produtos do tamanho qnt_pro certo? mais ou menos ... o malloc está a alocar um bloco de memória de tamanho "sizeof(Produtos) * qnt_pro". nada me impede de fazer : char * array_de_bytes = malloc(sizeof(Produtos) * qnt_pro); é certo que é do tamanho exacto de um array de "Produtos" com "qnt_pro" elementos, mas o que fazes desse bloco é contigo. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Trinkes Posted May 21, 2013 at 10:11 PM Author Report #508283 Posted May 21, 2013 at 10:11 PM mais ou menos ... o malloc está a alocar um bloco de memória de tamanho "sizeof(Produtos) * qnt_pro". nada me impede de fazer : char * array_de_bytes = malloc(sizeof(Produtos) * qnt_pro); é certo que é do tamanho exacto de um array de "Produtos" com "qnt_pro" elementos, mas o que fazes desse bloco é contigo. e como faço par os percorrer depois? (array+i) não pode...=X outra coisa, como uso os dados de uma estrutura que está dentro de outra estrutura? para usar os dados que estão dentro de uma estrutura é: Estrutura->idade então dados de uma estrutura que está dentro de outra estrutura deveria ser: Estrutura->data->dia mas não é...
Trinkes Posted May 24, 2013 at 12:06 AM Author Report #508679 Posted May 24, 2013 at 12:06 AM Acabei por resolver o problema com listas ligadas. Obrigado pela ajuda Podem fechar o tópico 🙂
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now