Ir para o conteúdo
ac88

dereferencing erro

Mensagens Recomendadas

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!

Editado por thoga31
Tags code + GeSHi

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ac88

pelo que percebi é isto que queres saber

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

Editado por thoga31
Tags code + GeSHi

Partilhar esta mensagem


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

  • Voto 1

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

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baptistazito

o tipo de dados é shard certo?

Btw eu e o ac88 estamos juntos nesta "coisa"

Editado por Baptistazito

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

threads ???

vocês não conseguem saber onde está um problema de typedef e andam a mexer com threads ? que é provavelmente a coisa mais difícil e complicada de programar e fazer debug ???

bem ... vocês lá sabem ...

infelizmente não ... tudo o que sei sobre threads ou foi me leccionado ou foi lendo o online

se apresentares o código, pode ser que alguém veja o que pode ser


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baptistazito

não era um problema de saber ou não de typedefs. Já estamos há uns dias nisto e depois há erros que não vemos infelizmente. Quanto à parte da threads sim tens razão. está-nos a dar uma dor de cabeça daquelas. é que nem sabemos muito bem onde começar. Mas basicamente o problema é o seguinte:

Queremos fazer um sistema para o armazenamento de dados chamado KOS. O KOS executa-se num único processo constituído por múltiplas tarefas. Entre as tarefas distinguem-se tarefas servidoras e clientes.

Temos uma hash table cujo numero de células é definido à partida. Cada célula tem um Shard lá dentro que por sua vez esse Shard vai ser a cabeça de uma lista de keys.

O que temos é isto:

char* kos_put(int clientid, int shardId, char* key, char* value) {
 printf("1\n");
 Pedido* p=(Pedido*)malloc(sizeof(Pedido));  
 sem_init(&p->sem, 0, 0);
 printf("2\n");  
 p->clientID=clientid;
p->Shard_ID=shardId;
 printf("3\n");  
 strcpy(p->conteudo,value);
strcpy(p->ID,key);
 printf("4\n");  
 p->funcao=1;
buf -> indicecliente = clientid;
buf -> indiceservidor = shardId;
 printf("5\n");
 push(p);
sem_wait(&p->sem);
 printf("6\n");  
 return p->ID;  
}

e usando o Gdb isto insere o primeiro elemento na lista mas depois quando vai ao segundo isto f****-se tudo.lol

Não sei se me estou a explicar bem, mas é isto.

PS: esqueçam os printf's, que esqueci-me de os tirar.

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

como disse, sem o código é impossível saber como resolver isso, no entanto estar a criar um semáforo na chamada de inserção de um elemento na lista é definitivamente algo errado no âmbito global da aplicação.


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

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.