Jump to content

[Resolvido] Erro ao passar estrutura por argumento


Recommended Posts

Posted (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 by pmg
GeSHi
Posted

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
Posted

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).

Posted (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 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!

Posted
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
Posted (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 by Trinkes
Posted

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
Posted

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 é...

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.