Página 1 de 3 123 ÚltimoÚltimo
+ Responder ao Tópico



  1. 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
    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. 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. 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. 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:






Tópicos Similares

  1. Problema com Iptables em Cache Server
    Por no fórum Servidores de Rede
    Respostas: 0
    Último Post: 04-10-2003, 00:53
  2. Problemas com Impressora em Rede
    Por no fórum Servidores de Rede
    Respostas: 1
    Último Post: 23-07-2003, 08:36
  3. Problemas com FTP em nat . .
    Por rafaelpazcolles no fórum Servidores de Rede
    Respostas: 0
    Último Post: 16-04-2003, 15:07
  4. qmail com problema em /var/spool/mail
    Por no fórum Servidores de Rede
    Respostas: 0
    Último Post: 11-03-2003, 12:57
  5. Ingressar Lilux com samba em um dominio com Active Directory
    Por Danilo_Montagna no fórum Servidores de Rede
    Respostas: 3
    Último Post: 23-01-2003, 18:47

Visite: BR-Linux ·  VivaOLinux ·  Dicas-L