Passar função como parametro

1. Passar função como parametro

Paulo
paulo_moc

(usa Ubuntu)

Enviado em 19/09/2012 - 14:26h

Olá pessoa, gostaria de saber como eu posso passar uma função qualquer por parametro, fuçando na net achei uma forma :

typedef <retorno_aqui> (funcao)(int argumento)

só que essa forma é muito especifica, teria alguma forma de eu usar um tipo mais "maleável", que quando ele recebe um tipo ele se transforma nele, ex:

typedef maleavel (funcao)(maleavel argumento, ...);

Preciso disso pois quero utilizar Threads e preciso passar uma função como parâmetro para que ela possa ser executada...


  


2. Passar função como parametro

Mariana Ribeiro Mendes
meldenne

(usa Linux Mint)

Enviado em 19/09/2012 - 15:10h

Eu encontrei isto, talvez ajude, mas talvez seja as mesmas que você encontrou.

http://forum.clubedohardware.com.br/como-criar-funcao/727558

http://blogdotakemura.blogspot.com.br/2011/03/dicas-de-programacao-como-passar-uma.html

=D


3. Re: Passar função como parametro

Paulo
paulo_moc

(usa Ubuntu)

Enviado em 19/09/2012 - 15:14h

Clube do hardware, foi lá que eu encontrei mesmo... vou ver a segunda.

valeu ae


4. Re: Passar função como parametro

Paulo
paulo_moc

(usa Ubuntu)

Enviado em 19/09/2012 - 15:23h

Ele disse no tópico que existe um forma genérica de fazer isso, sabe onde eu encontro o link para isso? procurei no blog dele e não encontrei.


5. Re: Passar função como parametro

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/09/2012 - 15:32h

Você quer chamar uma função f(), cujo tipo de retorno e tipos dos argumentos não batem com que uma determinada interface espera?

Você pode usar um daqueles type-casts que praticamente distorcem o espaço-tempo e o deixa sujeito a assombrações. Por exemplo, para transformar um ponteiro para função qualquer num ponteiro de função que não recebe nem retorna coisa alguma -- um exemplo, portanto, extremamente simples, muito mais simples, certamente, do que qualquer coisa que lhe venha a ser útil -- você teria a seguinte sintaxe supertrivial.

int f(int x){ /* função exemplo */
x*=x; /* Não usual, mas válido, e só para ficar mais interessante. */
return x;
}

int call_func_ptr(void (*ptr_f)(void)){
ptr_f();

return 0;
}

int main(void){
/* Note o cast na linha abaixo. Claro como água cristalina, não? */
return call_func_ptr((void (*)(void))f);
/* Note que o compilador vai aceitar essa chamada, já que ptr_f diz *
* que não recebe argumento algum, mas nós sabemos muito bem que é *
* f() que será invocada no fim das contas, e omitindo-se o parâme- *
* tro que ela espera receber. O que vai acontecer é que a opera- *
* ção "*=" no corpo da função vai alterar o endereço de retorno ou *
* outra estrutura de controle da pilha. O resultado disso é im- *
* predizível, mas provavelmente será danoso. */
}


Ou então, você pode ser um pouco mais civilizado e humilde, e usar, em lugar de um cast que faça fingir que uma função é de um tipo diferente do que realmente é, criar uma função com o tipo desejado, chamando a função original manualmente dentro dessa segunda função. Nesse caso, o exemplo acima poderia ser reescrito como se segue.

int f(int x){ /* função exemplo */
x*=x; /* Não usual, mas válido, e só para ficar mais interessante. */
return x;
}

void f_wrapper(void){
f(0); /* Usa um valor dummy só para satisfazer o compilador. Ignora *
* o valor de retorno -- o que é comum em C. */
}

int call_func_ptr(void (*ptr_f)(void)){
ptr_f();

return 0;
}

int main(void){
return call_func_ptr(f_wrapper);
}



6. Passar função como parametro

Mariana Ribeiro Mendes
meldenne

(usa Linux Mint)

Enviado em 19/09/2012 - 15:52h

Eu não encontrei nada lá também, e acredito que você queira em C e não em C++ não é?

Eu não posso ajudar muito, porque estou começando com C agora, sei muito pouco. No java há o "java generics" mas não sei se isso é possível em C. Não ouvi falar, pelo menos. Vou procurar um pouco mais e perguntar um amigo que conhece a linguagem e depois posto aqui.

De toda forma, se houver um "C generics", provavelmente será apenas aplicar o conceito de genéricos nas suas classes.


7. Re: Passar função como parametro

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/09/2012 - 16:06h

Provavelmente o jeito de deixar genérico deve ter relação com templates (e talvez templates recursivos, introduzidos no novo padrão do C++, publicado em 2011).

Aliás, é bom lembrar que o Java Generics é claramente inspirado nos templates de C++, que vieram primeiro (e que, durante algum tempo, foram desprezados pelos arquitetos do Java, por ser uma das causas comuns de confusões para programadores pouco experientes no C++).


8. Re: Passar função como parametro

Paulo
paulo_moc

(usa Ubuntu)

Enviado em 19/09/2012 - 16:07h

hehe... meio confuso, mas acho que entendi, a segunda opção é melhor (=]).

Eu fiz esse código

void* teste();
int teste2();

int main()
{
int *p;
p =(int*) teste();

cout<<*p;

getch();
}

int teste2()
{
int p = 10;
return p;
}

void* teste(void)
{
int p = teste2();

return &p;
}
eu coloco a função teste como parametro do construtor da Thread, a classe possui um tipo para uma função : typedef void(funcao)(void), e pelo método iniciar(), eu 'runo'(=]) a função que 'runa' teste que 'runa' teste2 que retorna um p(10) para teste que retorna &p para iniciar() que faz a mesma coisa que teste e retorna para quem precisar.

no exemplo acima, é como se o 'main' fosse o método iniciar.

não testei ainda mas vou agora... espero que funcione

=]


9. Re: Passar função como parametro

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/09/2012 - 16:38h

void* teste(void)
{
int p = teste2();

return &p;
}


Problema!!! Você está retornando o endereço de uma variável local, que deixa de existir assim que a função chega ao final. Você deu "sorte" de o valor não ter sido alterado entre o retorno da função e o momento em que você o usa (até porque as duas coisas acontecem imediamente em sequência no seu programa), mas é certo que você não deveria confiar qe esse tipo de coisa sempre vá funcionar.


10. Re: Passar função como parametro

Paulo
paulo_moc

(usa Ubuntu)

Enviado em 19/09/2012 - 17:31h

hmm, valeu a dica, dessa forma variáveis estáticas também pode ter seu valor mudado por outro programa?


11. Re: Passar função como parametro

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/09/2012 - 18:14h

Não. Variáveis com alocação estática têm tempo de vida igual ao do próprio programa,


12. Re: Passar função como parametro

Paulo
paulo_moc

(usa Ubuntu)

Enviado em 19/09/2012 - 18:20h

hmm, ok muito obrigado, e só mais uma coisa, eu fiz o seguinte código :

#ifndef THREADS_H_
#define THREADS_H_

#include <windows.h>

typedef DWORD WINAPI(thread)(LPVOID);

class Thread
{
public:
Thread(thread);
void Iniciar();
void Pausar();
void Retornar();
void Finalizar();
private:
DWORD id;
HANDLE th;
thread func;
};

#endif

e o .cpp é :

#include "threads.h"

Thread::Thread(thread func)
{
this->func = func;
}

está dando erro na atribuição.
invalid use of member (did you forget the '&'?)


se pudesse ensinar como colocar essa área de código é bom também =]






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts