Jump to content
Trinkes

[Resolvido] Erro ao passar estrutura por argumento

Recommended Posts

Trinkes

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
Trinkes

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

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
Trinkes

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

Share this post


Link to post
Share on other sites
Trinkes

Mais uma questão:

-O malloc como está gera um array de produtos do tamanho qnt_pro certo?

Ninguém sabe?=x

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
Trinkes

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

Share this post


Link to post
Share on other sites
Trinkes

Acabei por resolver o problema com listas ligadas.

Obrigado pela ajuda

Podem fechar o tópico :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.