Jump to content
Baptistazito

Dúvida de implementação

Recommended Posts

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

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

nessa estrutura toda, onde guardas o id do cliente e o id do shard ?


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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
Baptistazito

o id do shard vai ser o indice do Shard[id] e o id do cliente vai ser guardado dentro de da estrutura key

Share this post


Link to post
Share on other sites
HappyHippyHippo

dentro de da estrutura key

aonde ? como ? quando ? com que ?

eu olho para essa estrutura e não vejo nada


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

Share this post


Link to post
Share on other 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 ?

Edited by ac88
  • Vote 1

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Edited by Baptistazito

Share this post


Link to post
Share on other sites
ac88

ou criamos uma variavél global e quando inicializamos a lista dizemos que a variavel global é igual à lista ?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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 ?

Edited by thoga31
Tags code + GeSHi + formatação do post

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
ac88

sim eu sei. mas é esta lista que queremos usar nas funções. é por isso que gostava de saber se dá para pôr como global

Share this post


Link to post
Share on other 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?

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.