Ir ao conteúdo
  • Cadastre-se

Duvida de Ponteiro para funcao que recebe funcao


William.Mendes

Posts recomendados

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;}
Link para o comentário
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;}
Link para o comentário
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.

Link para o comentário
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;}
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • mês depois...

//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;}
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...