Jump to content
ac88

dereferencing erro

Recommended Posts

ac88

Boas malta,

tenho estado a desenvolver um projecto para uma cadeira da faculdade e surgiu este erro e não estou a conseguir resolver.

Eu tenho estas estruturas:

typedef struct key{
  char* chave[size];
  char* valor[size];
}key_id;

typedef struct shard{
  int indice;
  struct key_id* first;
}shard_h;

typedef struct lista{
  int shard;
  struct shard_h* hashmap[];
}lista_h;

Agora tenho de criar uma estrutura lista_h e criar um array de shard_h dentro desta estrutura e um key_id dentro de cada shard. tenho este código

...
lista=(lista_h*)malloc(sizeof(lista_h);
...
lista -> hashmap[i] = (shard_h*)malloc(sizeof(shard_h));
lista -> hashmap[i] -> first = (key_id*)malloc(sizeof(key_id));

quando vou compilar diz-me:

error: dereferencing pointer to incomplete type

alguém me pode ajudar ? desde já obrigado!

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo
typedef struct lista{
  int shard;
  struct shard_h* hashmap[]; // <---- que tipo de dados é : "struct shard_h" ?
}lista_h;


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
ac88

como assim ? eu com essa linha queria criar um vector de estruturas do tipo shard_h chamado hashtable.

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu sei perfeitamente o que queres fazer ... vou assumir que, como és novo no fórum, não terás lido bem a pergunta. não importa, eu repito :

que tipo de dados é struct shard_h ?

agora responde à pergunta e somente à pergunta (com demonstração de código, preferencialmente)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
ac88

pelo que percebi é isto que queres saber

typedef struct shard{
  int indice;
  struct key_id* first;
}shard_h;

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu não quero saber porque eu sei a resposta, eu quero que penses no que escreveste

pensa novamente : struct shard_h

que tipo de dados é esse ?

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pwseo

Já agora, e quando descobrires o erro para o qual o HappyHippyHippo está a tentar apontar-te, fica também a dica de que em C não se faz cast do resultado da função malloc (em C++ a história é outra):

// Isto não se deve fazer:
lista=(lista_h*)malloc(sizeof(lista_h);

// Assim é que é correcto em C:
lista = malloc(sizeof(lista_h));

Share this post


Link to post
Share on other sites
HappyHippyHippo

Já agora, e quando descobrires o erro para o qual o HappyHippyHippo está a tentar apontar-te, fica também a dica de que em C não se faz cast do resultado da função malloc (em C++ a história é outra):

// Isto não se deve fazer:
lista=(lista_h*)malloc(sizeof(lista_h);

// Assim é que é correcto em C:
lista = malloc(sizeof(lista_h));

é um problema normal de quem compila C num compilador de C++ como no VC++ ... por isso já nem me preocupo com isso quando aparece aqui no fórum


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pwseo

Pois, mas mesmo o VC++ tem uma flag (/TC) para compilar em modo C (não sei bem que standard suporta, mas os mallocs ficam correctos) :)

Share this post


Link to post
Share on other sites
Baptistazito

o tipo de dados é shard certo?

Btw eu e o ac88 estamos juntos nesta "coisa"

Edited by Baptistazito

Share this post


Link to post
Share on other sites
thoga31

o tipo de dados é shard certo?

Errado. Estás a cometer um erro clássico dos principiantes que se viciam em typedef como se fosse cocaína.

Tu fizeste este typedef...

typedef struct shard { ... } shard_h;

...e depois fizeste esta chamada...

struct shard_h* ...;

O que é struct shard, shard_h e struct shard_h? São todos "sinónimos"?


Knowledge is free!

Share this post


Link to post
Share on other sites
Baptistazito

Sinto-me rebaixado...lol

A ver se percebo isto. Shard é o tipo da estrutura. shard_h a sua declaração e o shard_h* será um apondador da estrutura shard_h?!

Share this post


Link to post
Share on other sites
ac88

Eu penso que struct shard e shard_h são a mesma coisa. Estou certo ? Quanto ao struct shard_h estou confuso...

Share this post


Link to post
Share on other sites
thoga31

Sinto-me rebaixado...lol

A ver se percebo isto. Shard é o tipo da estrutura. shard_h a sua declaração e o shard_h* será um apondador da estrutura shard_h?!

Muito bem. Só não respondeste à questão de sempre: o que é struct shard_h? O que é shard_h e shard_h* já todos sabemos e tu também. Mas então struct shard_h??

Dica:

typedef tipo alias;

// são sinónimos:
tipo variavel;
alias variavel;

// seja "tipo" uma struct, o que estás a fazer é:
struct alias variavel;

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
Baptistazito

para mim struct shard_h será uma declaração dentro de outra estrutura o que não é isso que pretendo fazer. logo terei de tirar o struct e pôr

shard_h* hashmap[];

Am i right?

Share this post


Link to post
Share on other sites
thoga31

struct shard_h é um tipo de dados que não existe. Tu tens é struct shard cujo alias é shard_h.

Por isso sim, estás certo. Tira dali aquele "struct", estás a invocar algo inexistente.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

entao mas eu devo tb tirar os structs do next e coisas assim?

Pensa lá um pouco. Tens de pensar naquilo que estás a criar com o typedef e, por conseguinte, na forma como podes chamar os tipos.


Knowledge is free!

Share this post


Link to post
Share on other sites
HappyHippyHippo

faz um pequeno teste:

struct S {
 int value;
};

typedef int MyInt;
typedef struct S MyStruct;
typedef struct S S;

int main() {
 int i;                             // correcto ?
 MyInt my_int;                      // correcto ?

 struct S s;                        // correcto ?
 MyStruct my_struct;                // correcto ?
 struct MyStruct struct_my_struct;  // correcto ?
 S _s;                              // correcto ?

 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Baptistazito

hmm tou a ver. Já agora nao têm por acaso aí um tutorial de threads para totós que isto está com um seg fault lixado com f grande e n faço ideia do q tá bem ou mal sff!

Share this post


Link to post
Share on other sites

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.