Colocar uma estrutura num ponteiro void (C)
Eawe povo.......to meio sem tempo pra ajuda o povo mas sempre q eu posso eu to ai.....se alguem puder me ajudar com isso eu com certesa vo te mais tempo pro underlinux, eh o seguinte..
finalmente eu comecei a desenvolver em C com BerkeleyDB, estava tendo sucesso ateh cismar de armazenar uma estrutura de dados no banco, inicialmente apos mto sofrimento eu consigui armazenar uma estrutura dentro do maldito banco, tudo ordenado bunitinho, POREM, estava tudo dentro da funcao main(), agora pra ficar melhor o programa eu tive q dividir o programa em funcoes, dai eu criei uma estrutura mais ou menos assim:
Código :
struct{
int id.
char nome[150];
} my_fields;
typedef struct(
int N;
struct my_fields fields;
} MY_TABLE;
ai eu declaro uma variavel do tipo MY_TABLE como ponteiro:
dai eu faco as funcoes terem como argumento uma variavel do tipo MY_TABLE e tbm como ponteiro, assim:
Código :
int funcao(MY_TABLE *tabela);
ateh ai td bem....eu manipulo a estrutura do jeito q eu quizer......soh q tem a maldita estrutura DBT que eh do proprio Berkeley, ela eh assim:
Código :
typedef struct {
void *data;
u_int32_t size;
u_int32_t ulen;
u_int32_t dlen;
u_int32_t doff;
u_int32_t flags;
} DBT;
dai pra eu armazenar alguma coisa no banco eu tenho q fazer assim:
1° eu seto o tamanho do dado usando data.size=sizeof(tabela)+sizeof(tabela.fields);
2° eu seto o conteudo do dado em data.data (ja previamente declarado assim: DBT data);
soh q pra armazenar uma estrutura eu usavava o memcpy assim:
Código :
memcpy(&data.data,tabela,sizeof(tabela)+sizeof(tabela.fields));
soh q depois q eu tive q separar em funcoes, essa porra paro de funciona e passo a dar falha de segmentacao :cry:
alguem sabe o porquê??????
Kakaroto??? chvt??? alguem?????
Colocar uma estrutura num ponteiro void (C)
E ae.
se a variavel "tabela" é um ponteiro para a estrutura MY_TABLE
e vc quer copiar o valor para dentro da estrutura DBT
vc deve tentar usar operador de resgate de valor *;
Citação:
memcpy(&data.data, *tabela, sizeof(tabela)+sizeof(tabela.fields));
Talvez seja isso;
Abraços.
Colocar uma estrutura num ponteiro void (C)
ae, valeu hez4el, mas continuou dando falha de segmentacao quando eu rodo ele, vc nao sabe como eu poderia fazer pro ponteiro do void apontar pro mesmo endereco da memoria do ponteiro da estrutura???
ps.: "data.data=&tabela;" nao funciona tbm... :cry: :cry:
Colocar uma estrutura num ponteiro void (C)
vc pode postar o trecho completo do código dividido em funções pra eu dar ma olhada, acho que a movimentação em memória pode estar errada em algum ponto e o ponteiro de tabela pode estar indo vazio.
Dando uma olhada no código da pra confirmar. Essas operações
com ponteiro em c são realmente dificieis de debugar.
Abraços.
Colocar uma estrutura num ponteiro void (C)
o codigo em si eh isso aqui:
Código :
int ret;
int maior;
//int a;
char nome[121];
DBT key,data;
printf("Nome: ");
fgets(nome,120,stdin);
nome[strlen(nome)+1]='\0';
memset(&key,0,sizeof(key));
memset(&data,0,sizeof(data));
maior=biggest(tabela);
maior++;
tabela->N+=1;
tabela->fields[maior].id=maior;
strcpy(tabela->fields[maior].nome,nome);
memcpy(&data.data,&tabela,sizeof(tabela)+sizeof(tabela->fields));
data.size=sizeof(tabela)+sizeof(tabela->fields);
//data.flags=DB_DBT_MALLOC;
//return(0);
key.data="tabela1";
key.size=strlen("tabela1");
ret=db->put(db,NULL,&key,&data,0);
if(ret!=0){
printf("ERRO:\n%s\n",db_strerror(ret));
}else{
printf("Registro inserido com sucesso\n");
}
return(0);