Ir ao conteúdo
  • Cadastre-se
William.Mendes

Duvida de Ponteiro para funcao que recebe funcao

Recommended Posts

Boa tarde a todos,

estou com uma duvida sobre como usar ponteiro para função que recebe função como parâmetro, através do uso de ponteiro.

o exemplo pode ser compilado e está funcionando,

mas após retirar o comentário da chamada das funções da erro nas linhas:

    //funcao3(func1);
    //ou
    //funcao4(func1);
    //ou
    //funcao5(func1);

As outras chamadas estão funcionando corretamente, não sei qual das formas seria correta então tentei as 3, mas mesmo assim não funcionou.

 

 

 

//c++

#include <iostream>#include <string>using namespace std;void func1(){ cout << "run func1()" << endl; };void func2(){ cout << "run func2()" << endl; };void func3(void (*func)()){ func(); };int number(int *x){ return (*x); }int main(){    //ponteiro para funcao    void (*funcao)();    void (*funcao2)();        //ponteiros para funcao em teste, funcao3 e funcao4 sao ponteiros para funcao que recebe como parametro funcao como ponteiro.    //declaração e apontamento estão funcionando, mas chamada da funcao esta com erro.    //test function 3, 4 and 5...    void (*funcao3)();    void (*funcao4)(void(*));    void (*funcao5)(void *);        funcao = (void(*)())func1;    funcao();        funcao = (void(*)())func2;    funcao();        funcao2 = func1;    funcao2();        funcao2 = func2;    funcao2();        func3(func1);    func3(func2);        cout << "em teste:" << endl;        funcao3 = (void(*)())func3;    funcao4 = (void(*)(void(*)))func3;    funcao5 = (void(*)(void*))func3;    //error call function    //chamadas com erros, uma das duas deveria funcionar    //funcao3(func1);    //ou    //funcao4(func1);    //ou    //funcao5(func1);            return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em C, eu faço assim:

// Simples Code - simple_code.c#include <stdio.h>int func1(int n);void func2( int(*)(int) );//C Programint main(){ void (*f2)(int(*)(int) );    f2 = func2;return ( 0 );}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Mauro,

tentei aplicar mas não consegui,

até usando como base C se consegui me ajudar vou passar o mesmo código em C,

esse problema não é relacionado a C++,

ele vem da linguagem base C mesmo,

na verdade não é nem problema da linguagem e sim da minha lógica para aplicar a solução,

mas fico grato pela ajuda.

Obrigado

//em C#include <stdio.h>//#include <iostream>#include <string>//using namespace std;void func1(){    //cout << "run func1()" << endl;    printf("run func1()\n");};void func2(){    //cout << "run func2()" << endl;    printf("run func2()\n");};void func3(void (*func)()){    func();};int number(int *x){    return (*x);}int main(){    //ponteiro para funcao    void (*funcao)();    void (*funcao2)();        //ponteiros para funcao em teste, funcao3 e funcao4 sao ponteiros para funcao que recebe como parametro funcao como ponteiro.    //declaração e apontamento estão funcionando, mas chamada da funcao esta com erro.    //test function 3, 4 and 5...    void (*funcao3)();    void (*funcao4)(void(*));    void (*funcao5)(void *);        funcao = (void(*)())func1;    funcao();        funcao = (void(*)())func2;    funcao();        funcao2 = func1;    funcao2();        funcao2 = func2;    funcao2();        func3(func1);    func3(func2);        //cout << "em teste:" << endl;    printf("em teste:\n");        funcao3 = (void(*)())func3;    funcao4 = (void(*)(void(*)))func3;    funcao5 = (void(*)(void*))func3;    //error call function    //chamadas com erros, uma das duas deveria funcionar    //funcao3(func1);    //ou    //funcao4(func1);    //ou    //funcao5(func1);            return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você que e retomar através de uma função o ponteiro de outra? E também passar função por parâmetro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que estou tentando fazer é um ponteiro para func3 dentro do main,

como pode ver os ponteiros funcao3, funcao4 e funcao5 são tentativas para apontar para func3,

apesar das declaração de cada um ser diferente do outro,

a declaração e apontamento não apresentam erros,

mas ao tentar passar func1 para dentro do ponteiro de func3 da erro !

por isso deixei as linhas que estão dando erro comentadas aqui:

    //funcao3(func1);
    //ou
    //funcao4(func1);
    //ou
    //funcao5(func1);

como pode ver todas elas estão apontando para func3 como aqui:

    funcao3 = (void(*)())func3;
    funcao4 = (void(*)(void(*)))func3;
    funcao5 = (void(*)(void*))func3;

mas nenhuma das tentativas deu certo para chamar a execução da função passando func1 como parâmetro.

 

chamando func3 diretamente passando func1 como parâmetro funciona normalmente,

mas ao tentar fazer um ponteiro para func3 e passar func1 para dentro dele não funciona,

sei que é possível só não consegui acertar na sintaxe,

não sei se estou errando na declaração desses ponteiros, no apontamento ou na chamada da função.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi o seu problema, porém não sei explicar como fazer passo a passo;

Então examine o trabalho abaixo e faça qualquer pergunta se precisar:

// Simples Code - simple_code.c#include <stdio.h>#define X 20#define Y 30//#Function Prototypeint add( int, int );//+int CalculatorNumbersArithmetic( int, int, int(*)(int,int)/*Ponteiro de função*/ );//Here this prime functionint main( void ){    int (*Calc)( int, int, int(*)(int,int) );//Ponteiro de Função        Calc = CalculatorNumbersArithmetic;        printf( "Calcule: %d + %d\n", X, Y );        printf( "Resposta: %d\n\n", Calc(X,Y,add)  );printf( "Acabou\nPrecione->[ENTER] para sair..." );getchar();return ( 0 );}//#Prototype Defint CalculatorNumbersArithmetic( int x, int y, int(*Oper)(int,int)  ){return(Oper(x,y));}int add( int n1, int n2 ){    int sum;        sum = n1 + n2;return sum;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

valeu pela ajuda consegui resolver o problema e até a fazer de formas diferente !!!,
consegui entender perfeitamente como devem ser declarado o prototipo dos ponteiros,
e associação no caso das funções que recebem valores,
variáveis ou outras funções como parâmetro.
Obrigado e segue código de como ficou da forma mais simples.
 

#include <stdio.h>//#include <iostream>#include <string>//using namespace std;void func1(){//cout << "run func1()" << endl;printf("run func1()\n");};void func2(){//cout << "run func2()" << endl;printf("run func2()\n");};void func3(void (*func)()){func();};int number(int *x){return (*x);}int main(){//ponteiro para funcaovoid (*funcao)();void (*funcao2)();//ponteiros para funcao em teste, funcao3 e funcao4 sao ponteiros para funcao que recebe como parametro funcao como ponteiro.//declaração e apontamento estão funcionando, mas chamada da funcao esta com erro.//test function 3, 4 and 5...void (*funcao3)();void (*funcao4)(void(*));void (*funcao5)(void *);void (*funcao6)(void (*)());funcao = (void(*)())func1;funcao();funcao = (void(*)())func2;funcao();funcao2 = func1;funcao2();funcao2 = func2;funcao2();func3(func1);func3(func2);//cout << "em teste:" << endl;printf("em teste:\n");funcao3 = (void(*)())func3;funcao4 = (void(*)(void(*)))func3;funcao5 = (void(*)(void*))func3;funcao6=func3;//error call function//chamadas com erros, uma das duas deveria funcionar//funcao3(func1);//ou//funcao4(func1);//ou//funcao5(func1);funcao6(func1);return 0;}
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

//bom pode ajudar mais pessoas, esse exemplo que montei ficou bem claro como usar função para ponteiro

#include <stdio.h>void func1(){    printf("run func1()\n");};void func2(){    printf("run func2()\n");};void func3(void (*func)()){    printf("run func3()\n");    func();};void func4(void (*f1)(void (*)()),void (*f2)()){    printf("run func4()\n");    f1(f2);};void func5( void (*f1)(void (*)()), void (*f2)(), void (*f3)()){    printf("run func5()\n");    f1(f2);    f1(f3);};int main(){    //declaracao, ponteiro para funcao    void (*funcao1)();    void (*funcao2)();    void (*funcao3)(void (*)());    void (*funcao4)(void (*)(void (*)()),void (*)());    void (*funcao5)(void (*)(void (*)()),void (*)(),void (*)());        //apontamento    funcao1 = func1; //ou funcao1 = (void(*)())func1;    funcao2 = func2;    funcao3=func3;    funcao4=func4;    funcao5=func5;    //exibir por funcao    func1();    func2();    func3(func1);    func3(func2);    func4(func3,func1);    func4(func3,func2);    func5(func3,func1,func2);        //exibir por ponteiro    funcao1();    funcao2();    funcao3(func1);    funcao3(func2);    funcao4(func3,func1);    funcao4(func3,func2);    funcao5(func3,func1,func2);        return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×