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:
Estruturas com funcoes em C
fala ai, blz!?
o q vc fez ta 99% certo! hehehehehehe... tira somente o '*' depois do nome da funcao: sua funcao simplesmente tah retornando void (eh o que a declaracao do ponteiro diz), nao ponteiro pra void (eh o que a declaracao da funcao diz... (nao tah dando warning nao??))
sobre o problema, sinistro essas paradas q faz todo mundo puxar os cabelos com ponteiros em C: vc declarou o ponteiro mfs, mas o buffer de fato nao ta alocado (a area de memoria) - o q vc declarou eh uma area de memoria pra armazenar outro endereco de memoria. (:
vc AINDA nao tem uma espaco na memoria pra 'jogar' o valor de (void *) AddCliente (linha abaixo ao main()) em mfs->funcAddCliente (MAS, tem uma variavel que FUTURAMENTE apontara prum lugar do tipo da struct).
Código :
vc tem:
_____
| |
|*mfs| ---> xxxx
|____|
vc precisa
_____ ___________
| | | |
|*mfs| ---> | tipo |
|____| | de dado |
| da struct |
| declarada |
| |
|__________|
(putz... como faco texto em texto ASCII com tamanho fixo?)
depois de um malloc() ou de declarar 'fisicamente' o buffer (area de memoria e referenciar o ponteiro), vc pode atribuir.
(entao, essas paradas sao meio chatinhas mesmo... se for pra conhecer e aprender como funcemina, vale apena aprender!! se for pra trabalho e tal, c++ sem duvida)
/* no momento to sem acesso a uma maquina com compilador, mas deve ser +/- isso... */
#include <stdio.h>
#include <stdlib.h>
struct myFuncStruct{
int cod;
char nome[30];
void (*funcAddCliente)(int , char *);
} *mfs, msfBuff;
void AddCliente(int cod, char *nome){
mfsBuff.cod = cod;
strcpy(mfsBuff.nome, nome);
}
int main(){
mfs = &msfBuff;
mfs->funcAddCliente = (void *) AddCliente;
mfs->funcAddCliente(5,"Oii");
}
blz?
Estruturas com funcoes em C
ótimo, digno de code contest...
desse modo a alocação de mfs aponta para msfBuff e fica tudo certo.
mas da muito trampo pra pouca coisa...
Estruturas com funcoes em C
NOOOOOOOOSSSAAA.......rodei o bagulho e quase gozei.....pqp....quando eu crescer quero ser como voces.....vlw....ajudar pra cac***
Estruturas com funcoes em C
fala ai hez4el
eh... heheheheh (code contest eh muito bom)
por isso q C eh fogo... eu o defino como: "o cumulo da simplicidade feito da forma mais complexa possivel imaginada" :D
bem, depende da finalidade q o SDM quer: aprender/curiosidade ou usar a ideia efetivamente em um produto (que, na minha opniao, eh loucura se ele nao tiver fazendo algo BEM baixo nivel).
Estruturas com funcoes em C
Citação:
Postado originalmente por a2gs
(que, na minha opniao, eh loucura se ele nao tiver fazendo algo BEM baixo nivel).
num noto pelos palavrao q eu falo em baixo nivel.... :lol: :lol:
eu soh num intendi essa ideia do "Code contest" :oops:
Estruturas com funcoes em C
eh uma competicao pra ver quem escreve o codigo funcional mais obscuro, mais hardcore, mais embaralhado possivel (somente codigos em C). saca soh:
http://www.ioccc.org/
Vencedores de 2001:
http://www0.us.ioccc.org/years.html#2001
tem umas coisas muito sem nocao! pra quem nao tem mais o q fazer e neuronios de sobra pra queimar, eh uma boa diversao... hehehehehe
eh o inicio do caos! :)
Estruturas com funcoes em C
nossa veio....irado o bagulho.....nego num tem o q fazer msm......mto foda o bagulho.... 8O :lol:
Estruturas com funcoes em C
Realmente podiamos fazer uns aqui de vez em quando...
a gente propunha um tema ou um objetivo, e cada um faz o código
como achar melhor em php, c, c++, java desde que funcione...
depois da um salva de palmas para
1 o que ficar mais simples e funcionando
2 o que ficar mais ilegivel e funcionando
Estruturas com funcoes em C
po...eu apoio hein......ia ser dahora.... :wink: