View Full Version : [C] Ponteiros para funções noutro ficheiro
Aparicio 30-07-2008, 16:23 Boas,
estou a utilizar uns ponteiros para funções noutro ficheiro mas dá erro por a função não estar definida, para resolver isto tenho de estar a definir a função no mesmo ficheiro, mas para muitas funções não dá jeito.
Num exemplo simples:
main.c
int soma( int x, int y );
int main( int argc, char **argv )
{
int (*func)( int x, int y );
func = &soma;
printf( "%d\n", (*func)( 5, 6 ) );
return 0;
}func.c
int soma( int x, int y )
{
return x + y;
}O que eu queria era que isto funcionasse sem ser preciso o int soma( int x, int y ); no main.c.
Alguma sugestão?
sapropel 30-07-2008, 17:34 porque não usas headers? é para isso que eles servem.
fazes um func.h com as declarações todas, e um func.c com a definições todas e incluis o .h no main.c e pronto.
Aparicio 30-07-2008, 18:48 Se não arranjar outra solução terei de fazer isso, mas gostava de saber se existe uma alternativa.
A alternativa é mesmo essa. Os ficheiros header possibilitam entre outros, exactamente o que pedes.
Aparicio 30-07-2008, 19:55 Mas se para aceder a uma função noutro ficheiro não é preciso porquê que para associar um ponteiro à mesma função já é preciso declara-la nesse ficheiro? É isto que não percebo...
Eu só não queria sempre que escrevo uma nova função estar a declara-la noutro lado, mas sendo assim é isso que vou ter que o fazer.
"Não é preciso" não é bem assim. Depende da ordem com que compilas os ficheiros. Se queres aceder a funções de outro ficheiro, fazes um ficheiro .h para cada .c, apenas com os cabeçalhos e com os devidos "includes". No ficheiro .c não te esqueças de fazer o include do respectivo .h
Aparicio 30-07-2008, 23:21 Não é? Eu tenho um projecto com vários ficheiros que acedem às funções uns dos outros sem ser preciso declarar nada.
O único header que tenho é um comum a todos os ficheiros .c onde estão as bibliotecas e as estruturas.
Bom, eu estou a tentar ajudar... Estou-te a dizer que a maneira CORRECTA de o fazer é através dos ficheiros .h
Mas isso depende se estás a usar um IDE como o Visual Studio, ou não (linha de comandos em Linux, por e.x.). Se estiveres em linha de comandos, a ordem com que compilas os ficheiros pode mascarar esse problema e não ser necessário... Mas não é boa programação. Diz-te alguém que já programa há alguns anos em C...
Qualquer das formas precisas sempre de headers para o queres fazer. É a solução... Aceitas se quiseres, como é óbvio.
Aparicio 31-07-2008, 00:31 Não digo que estejas a dizer algo mal, só estou a tentar perceber isto de estar dividido em vários ficheiros.
Acerca disso da ordem, mesmo que tenha dois ficheiros que acedam a funções um do outro continua a não haver problema se não declarar as funções. Não deveria não ser assim pelo que dizes? :confused:
Estou a utilizar o Dev-cpp.
Não conheço o Dev-cpp. No entanto se for como dizes, com "referências cruzadas" não deveria dar para compilar... Pelo menos no gcc ele não resolvia a compilação.
Agora já sabes: cada ficheiro tem um .h, que pode fazer includes de outros .h. Desta forma fica tudo organizado, e quando tiveres muitas funções em cada ficheiro não tens de andar a vasculhar pelo código a tentar perceber se a função está nesse ficheiro ou não. É para isso mesmo que servem os headers - para resolver problemas de referências cruzadas, e para estruturar melhor o código. Senão usava-se tudo no mesmo ficheiro, o que não faz sentido nenhum...
Aparicio 31-07-2008, 03:29 O Dev-cpp é bastante conhecido no Windows, e o compilador é o gcc.
Bem, a ver se começo a utilizar mais os headers. :)
Baderous 31-07-2008, 13:40 Os apontadores para funções (http://en.wikipedia.org/wiki/Function_pointer) não são usados com esse propósito que pretendes. São usados por exemplo para callbacks (http://en.wikipedia.org/wiki/Callback_(computer_science)). Apesar de também se poder fazer o que queres, não vejo vantagens nisso, e a solução dos headers é a mais indicada.
Aparicio 31-07-2008, 14:19 Estou a utilizar mais especificamente num caso em que tenho vários if, cada um vai provocar uma acção diferente mas todos repetem uma parte.
char* (*func)( setcfg*, setvar*, msg_s );
func = NULL;
if( ... ) func = &funcão1;
else if( ... ) func = &funcão2;
else if( ... ) func = &funcão3;
...
if( func != NULL )
{
char *resp = (char*)(*func)( cfg, var, msg );
ptrcl_msg( cfg, var, resp );
free( resp );
}Acho que são úteis aqui visto não ter que repetir esta última parte para cada if.
Para isto funcionar é que terei de usar os headers para definir as funções de cada ficheiro.
Realmente vê-se no código de aplicações open-source que utilizam headers para cada ficheiro, eu é que como nunca precisei nunca os utilizei com esse propósito.
|
|