Ir para o conteúdo
Trinkes

[Resolvido] Erro ao passar estrutura por argumento

Mensagens Recomendadas

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

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 */

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!:)

Editado por Trinkes

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 é...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.