Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Baptistazito

Dúvida de implementação

Mensagens Recomendadas

Baptistazito

Boas tardes...

Eu tenho aqui uma dúvida algo complexa...

O meu objectivo é fazer um vector de shards sendo que esse numero é conhecido à partida. Por exemplo 20.

Cada um desses Shards vai ter uma lista de keys. Imaginando que eu quero remover esse uma a key 3 da shard 17 como acedo à lista certa. Sendo que o cabeçalho/declaração da função remove é este e não pode ser modificado:

char* kos_remove(int clientid, int shardId, char* key)

mais ainda estou a usar vários ficheiros .c e .h, logo acho que declarar uma variável global como Shard[20] não irá funcionar. Segue tb aqui uma lista das minhas estruturas.

typedef struct key{
char* chave[HT_SIZE];
char* valor[HT_SIZE];
struct key_id* next;
}key_id;
typedef struct shard{
int indice;
key_id* first;
}shard_h;
typedef struct lista{
int shard;
pthread_mutex_t* mostrahash;
shard_h* hashmap[];
}lista_h;
lista_h * lista;
lista_h* init_list(int shard);

PS: não sei se me estou a explicar bem mas agraeceria uma resposta qualquer. Obrigado

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ac88

o id do cliente é guardado dentro de uma estrutura key na cahr chave e o id do shard é guardado dentro da estrutura shard no int indice

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ac88

nós temos uma função que inicializa as shards e coloca esse indice dentro da estrutura e temos outra função que coloca o id do cliente na estrutura key juntamente com o valor desejado.

Mas a duvida é se a função

char* kos_remove(int clientid, int shardId, char* key)

que não podemos alterar, como é que fazemos para aceder à nossa lista ?

nós pensamos em colocar a lista como variavél global ou assim mas não sabemos como o fazer.

Edit: nós inicializamos a lista e depois como é que lhe acedemos sem a passar como argumento para as outras funções ?

Editado por ac88
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Mas a duvida é se a função

char* kos_remove(int clientid, int shardId, char* key)

que não podemos alterar, como é que fazemos para aceder à nossa lista ?

como a função está declarada, não existe outra solução senão ter a lista globalmente acessível (infelizmente porque esse tipo de programação é desaconselhado a muitos níveis).

para ter uma variável globalmente acessível, basta duas coisas

- estar declarada fora de qualquer função

- o local/função que pretende manipular a informação na variável global deverá saber que existe essa variável


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baptistazito

mas tem que estar declarada onde? no .c em questão. no .c do main? e se for no .c da função em questão o main vai saber que ele existe? é isto que me faz confusão!

BTW: qe queres dizer com uma lista globalmente acessivel? Uma variável global do genero char Shard[20] ou qq coisa assim certo?

Editado por Baptistazito

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

exemplo de como declarar e usar uma variável global:

// my_glocals.h
extern int var;

// my_globals.c
int var = 0;

// main.c
#include "my_globals.h"

int main(int argc, char ** argv) {
 var = 10;

 printf("O valor da variavel global e : %d\n", var);

 return 0;
}


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ac88

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

haverá alguma maneira de pôr isto, shard_h* hashmap[];, como variável global depois de inicializar ?

Editado por thoga31
Tags code + GeSHi + formatação do post

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

haverá alguma maneira de pôr isto, shard_h* hashmap[];, como variável global depois de inicializar ?

isso não faz sentido.

ser global ou não é irrelevante ao momento da inicialização de um ponteiro


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

haverá alguma maneira de pôr isto, shard_h* hashmap[];, como variável global depois de inicializar ?

A tua pergunta não faz muito sentido. Primeiro, colocas uma variavel como global no momento em que escreves o código :P

Segundo, shard_h* hashmap[]; é um campo de uma estrutura. Não podes colocar um campo como global, e a estrutura não.

Mas há uma forma de tudo isto de encaixar, utilizando apontadores.

Podes declarar uma variável globalhashmap; e depois colocar o campo da tua estrutura a apontar para essa global.

Mas tudo depende do que vocês querem fazer, e convém que organizem bem as ideias, porque me dá a impressão que estais a fazer as coisas sem uma noção exacta do que querem fazer. Até porque o protótipo da função que vocês aí colocarram também não recebe nenhum elemento do tipo lista, logo não será que vocês querem a lista como global?

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.