+ Responder ao Tópico



  1. #1

    Padrão 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

  2. #2
    hez4el
    Visitante

    Padrão 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:


    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.

  3. #3

    Padrão 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.

  4. #4

    Padrão 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

  5. #5

    Padrão 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:

  6. #6

    Padrão 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?

  7. #7
    hez4el
    Visitante

    Padrão 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...

  8. #8

    Padrão Estruturas com funcoes em C

    NOOOOOOOOSSSAAA.......rodei o bagulho e quase gozei.....pqp....quando eu crescer quero ser como voces.....vlw....ajudar pra cac***

  9. #9

    Padrão 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"
    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).

  10. #10

    Padrão 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" ops:

  11. #11

    Padrão 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!

  12. #12

    Padrão Estruturas com funcoes em C

    nossa veio....irado o bagulho.....nego num tem o q fazer msm......mto foda o bagulho.... 8O :lol:

  13. #13
    hez4el
    Visitante

    Padrão 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

  14. #14

    Padrão Estruturas com funcoes em C

    po...eu apoio hein......ia ser dahora.... :wink: