Estruturas com funcoes em C
Ola, alguem ae sabe como eu posso criar uma estrutura q tenha funcoes como parte de seus campos????
pq o berkeleydb faz isso....ele tem a estrutura q ele definiu como o tipo "DB" ai ela tem funcoes dentro dela, como se a definicao da estrutura tivesse sido feita assim:
Código :
struct db {
int open(*dbp){
//corpo da funcao
}
int get(*dbp){
//corpo da funcao
}
int put(*dbp){
//corpo da funcao
}
// e assim vai....
};
dai....pra vc usar as funcoes eh soh fazer assim:
Código :
DB *dbp;
dbp->open(blalbla);
dbp->get(blabla);
dbp->put(blabla);
// e assim vai tbm...
ou seja, eh quase como se ele tivesse criado uma classe....q tem variaveis e funcoes....eu tentei olhar o fonte dele, mas num ajudo mto nao....
alguem tem alguma ideia do q eu preciso fazer pra consiguir algo mais ou menos assim???? :?: :?: :?: :?:
ps.: do jeito q eu fiz ai num funciona...eu ja tentei
Estruturas com funcoes em C
provalvemente o berkley db utiliza c++.
em c voce pode criar uma variavel do tipo void
que recebe o ponteiro de uma função por typecast;
porem não é o melhor jeito de fazer porque o comportamento
dele não é semelhante ao de uma classe ja que c não possui
ponteiro internos do tipo this e parent.
porem é possivel ex:
Citação:
struct myFuncStruct{
int cod;
char nome[30];
void *funcAddCliente;
} mfs;
void AddCliente(int *cod, char nome[30]) {
msf->cod = *cod;
msf->nome = nome;
}
int main(){
mfs->funcAddCliente = (void *) AddCliente;
}
este é o principio de funcionamento, mas sugiro usar c++
para estruturar melhor este tipo de trabalho.
Estruturas com funcoes em C
ola,
e C vc pode definir um ponteiro prum lugar do codigo. Vc define como: "ponteiro pra funcao X". assim:
int x(char a){
...
return 1;
}
int main(){
/* define o ponteiro */
int (*a)(char);
...
/* atribui o valor */
a=x;
...
/* chama a funcao do ponteiro */
a('w');
...
}
falow.
Estruturas com funcoes em C
desculpoe, faltou mais:
vc pode declarar o ponteiro dentro duma struct.
vc vai precisar de uma funcao do tipo x->inicia() pra atribuir todos os ponteiros q vc tem pras funcoes corretas (repare que isso se comporta como os 'construtores' de c++!!! podendo ter mais de 1!).
Trabalhando com .h mais as declaracoes static e const, da pra fazer algo parecido com public/private, e com + gambia ainda, da pra fazer herança simples!!!!! (:
Eh possivel 'emular' OO em C. Mas soh pode dizer q uma linguagem suporta OO quando isso eh lhe dado nativamente (soh me convenci disso depois q li um 'mané' chamado Bjarne Strosd432egwgu2442f23fstrup... hehehaehahehaeehheaahehehe... mulequinho metido ele! e pensa q sabe das coisas!! HA! hehehehe. O cara manda!). OO em C, vc precisa dumas gambiarras (""politicas de programacao"", hehehehehe, sei... sei...) pra ter isso.
Linus diz q C++ nao deve ser usado no kernel (e eu, IMHO, acho q ele ta certo). Apenas C puro... entao, ele(s) usam dessa tecnica pra, alem de ter OO (apenas o basico necessario), podem fazer coisas como LKMs.
ps1: pra declacao do ponteiro ( int (*a)(char); ) ficar mais 'bunita', use um typedef.
ps2: no exemplo, a funcao x retorna um int (e recebe um char). quando vc chamar a funcao (usando o ponteiro), vc pode capturar o valor de retorno normalmente.
ps3: a atribuicao do ponteiro basta dizer o nome da funcao (sem parametros ou parenteses! vc nao quer executa-la... quer seu endereco)
ps4: a declaracao do ponteiro DEVE ter o mesmo tipo e quantidade de parametros e retornar o mesmo tipo dado.
ps5: no arquivo db.h do SleepCat, linha 1232 eles determinam os "ponteiro-membros". Na funcao __dbcl_init() (uma delas) eles atribuem valores aos ponteiros.
falow
Estruturas com funcoes em C
huauhauhuha.....cara.....tive q ler esses seus 2 posts umas 30 vezes ateh entende do q se trata....ai eu tentei juntar o q vc disse com o que o nosso amigo hez4el disse, e fiz o seguinte:
Código :
#include <stdio.h>
#include <stdlib.h>
struct myFuncStruct{
int cod;
char nome[30];
void (*funcAddCliente)(int ,char[]);
} *mfs;
void *AddCliente(int cod, char nome[30]) {
mfs->cod = cod;
// mfs->nome = nome;
}
int main(){
mfs->funcAddCliente = (void *) AddCliente;
mfs->funcAddCliente(5,"Oii");
}
ele compilo bunitinho....soh q da falha de segmentacao.....ai eu dei um
gdb <arquivo>
e ele retorno o seguinte:
Program received signal SIGSEGV, Segmentation fault.
0x08048318 in main () at class02.c:17
17 mfs->funcAddCliente = (void *) AddCliente;
Se alguem consiguir me ajudar a continuar eu agradeco....
Ps.: Eu tava me referindo a essa parte do codigo do berkeley msm..... :wink: